Вы можете реорганизовать регулярное выражение как
N = re.compile(r'(?:{0})(?:\s(?:{0})){{0,9}}'.format('|'.join(numbers)))
Полученное регулярное выражение будет выглядеть как (?:one|two|three)(?:\s(?:one|two|three)){0,9}
и, таким образом, будет соответствовать одному вхождению числа слова, а затем 0-9 появлению пробела (используйте \s+
, чтобы разрешить более одного пробела между словами), а затем номер слова.
См. Python demo :
import re
numbers = ['one', 'two', 'three']
N = re.compile(r'(?:{0})(?:\s(?:{0})){{0,9}}'.format('|'.join(numbers)))
text = "one two three are my fav numbers"
m = N.search(text)
if m:
print ( '"{}"'.format(m.group()) ) # => "one two three"