Regex - поиск последовательных элементов из списка без запаздывания и запуск пробелов - PullRequest
1 голос
/ 31 марта 2020

У меня есть список произносимых номеров, и я хочу найти последовательных членов этого списка в тексте.

До сих пор я делал:

numbers = ['one', 'two', 'three']
N = re.compile(r'(({})\s){{1,10}}'.format('|'.join(numbers)))

К сожалению, когда у меня есть текст: «один два три мои любимые номера», что я получаю «один два три» с конечным пробелом. Однако я не могу удалить \s из своего регулярного выражения, поскольку числа в тексте разделяются пробелами.

Как в этом случае избежать совпадения начального и конечного пробелов?

1 Ответ

2 голосов
/ 31 марта 2020

Вы можете реорганизовать регулярное выражение как

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...