Регулярное выражение для поиска строки1, за которой никогда не следует строка2 - PullRequest
2 голосов
/ 07 июля 2010

Как построить шаблон поиска регулярного выражения, чтобы найти строку1, за которой не следует строка2 (сразу или нет)?

Например, если строка1 = "MAN" и строка2 = "ПН", примеррезультаты поиска будут такими:

"M": Not found
"MA": Not found
"MAN": Found
"BLAH_MAN_BLEH": Found
"MAN_PN": Not found
"BLAH_MAN_BLEH_PN": Not found
"BLAH_MAN_BLEH_PN_MAN": Not found

В идеале, однолинейный поиск вместо повторного поиска по строке 2.

PS: используется язык Python

1 Ответ

3 голосов
/ 07 июля 2010

Похоже, вы можете использовать MAN(?!.*PN). Это соответствует MAN и использует отрицательный прогноз, чтобы убедиться, что за ним не следует PN (, как видно на rubular.com ).

Учитывая MAN_PN_MAN_BLEH, вышеприведенный шаблон найдет вторую MAN, поскольку за ней не следует PN. Если вы хотите проверить всю строку и убедиться, что нет MAN.*PN, то вы можете использовать что-то вроде ^(?!.*MAN.*PN).*MAN.*$ (, как видно на rubular.com ).

Ссылки

Смежные вопросы


Параметр без регулярных выражений

Если строки должны совпадать буквально, вы также можете проверить индексы вхождений подстроки.

В Python find и rfind возвращают самый низкий и самый высокий индекс вхождений подстроки соответственно.

Таким образом, чтобы убедиться, что string1 встречается, но никогда не следует string2, и оба возвращают -1, если строка не найдена, так что похоже, что вы можете просто проверить это условие:

string.rfind(s, string2) < string.find(s, string1)

Сравнивает крайнее левое вхождение string1 и крайнее правое вхождение string2.

  • Если ничего не происходит, оба значения равны -1, а результат равен false
  • Если string1 происходит, но string2 нет, то результат равен true, как и ожидалось
  • Если происходит и то и другое, то самый правый string2 должен находиться слева от самого левого string1
    • То есть, за string1 никогда не следует string2

API ссылки

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