Как сопоставить все между A и B, но не пересекать границы предопределенного слова - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно регулярное выражение, чтобы оно совпадало со всем, начиная с "Привет" до "все" включительно, с любыми символами между ними.В случае 'и' , найденных между 'Hello' и 'Everyone' , выражение должно завершиться ошибкой.

Итак, эта строка "HelloВы и все "должны потерпеть неудачу, но это" Привет всем вам "должно совпадать.

Я пытался реализовать это примерно так:

Hello.*?((?!and)){1}everyone

, но это не терпит неудачу и

https://regex101.com/r/mX51ru/150

1 Ответ

1 голос
/ 28 марта 2019

Вы можете сделать:

^(?!Hello.*?\band\b.*?everyone)Hello.*?everyone
  • ^ соответствует началу строки
  • (?!Hello.*?\band\b.*?everyone) - это шаблон отрицательного прогнозирования нулевой ширины, чтобы убедиться, что слово and не входит между Hello и everyone
  • Hello.*?everyone соответствует требуемому вводу, имеющему Hello и everyone в строке

Пример:

In [1925]: str_1 = 'Hello you everyone'                                                                                                                                                                     

In [1926]: str_2 = 'Hello you and everyone'                                                                                                                                                                 

In [1927]: re.search(r'^(?!Hello.*?\band\b.*?everyone)Hello.*?everyone', str_1)                                                                                                                             
Out[1927]: <re.Match object; span=(0, 18), match='Hello you everyone'>

In [1928]: re.search(r'^(?!Hello.*?\band\b.*?everyone)Hello.*?everyone', str_2) is None                                                                                                                     
Out[1928]: True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...