Подтвердить что ты не робот

Regex для существования некоторых слов, порядок которых не имеет значения

Я хотел бы написать регулярное выражение для поиска существования некоторых слов, но порядок их появления не имеет значения.

Например, найдите "Тим" и "Глупый". Мое регулярное выражение Tim.*stupid|stupid.*Tim. Но возможно ли написать более простое регулярное выражение (например, чтобы два слова отображались только один раз в самом регулярном выражении)?

4b9b3361

Ответ 1

Смотрите это регулярное выражение:

/^(?=.*Tim)(?=.*stupid).+/

Объяснение Regex:

  • ^ Задает позицию в начале строки.
  • (?=.*Tim) Утверждает, что в строке присутствует "Тим".
  • (?=.*stupid) Утверждает, что в строке присутствует "глупо".
  • .+ Теперь, когда наши фразы присутствуют, эта строка действительна. Идем дальше и используем .+ или - .++ для соответствия всей строке.

Для более эффективного использования lookaheads вы можете добавить еще одну группу (?=.*<to_assert>). Все регулярное выражение можно упростить как /^(?=.*Tim).*stupid/.

Смотрите демо-версию regex!

>>> import re
>>> str ="""
... Tim is so stupid.
... stupid Tim!
... Tim foobar barfoo.
... Where is Tim?"""
>>> m = re.findall(r'^(?=.*Tim)(?=.*stupid).+$', str, re.MULTILINE)
>>> m
['Tim is so stupid.', 'stupid Tim!']
>>> m = re.findall(r'^(?=.*Tim).*stupid', str, re.MULTILINE)
>>> m
['Tim is so stupid.', 'stupid Tim!']

Подробнее:

Ответ 2

Для достижения этой цели вы можете использовать Positive Lookahead. Подход к обзору хорош для соответствия строк, содержащих обе подстроки независимо от порядка.

pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$')

Пример:

>>> s = '''Hey there stupid, hey there Tim
Hi Tim, this is stupid
Hi Tim, this is great'''
...
>>> import re
>>> pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$', re.M)
>>> pattern.findall(s)

# ['Hey there stupid, hey there Tim', 'Hi Tim, this is stupid']