Исключение строки в выражении регулярного выражения - PullRequest
0 голосов
/ 23 февраля 2019

В настоящее время у меня есть следующее регулярное выражение:

/(_|[a-z]|[A-Z])(_|[a-z]|[A-Z]|[0-9])*/

Я бы хотел, чтобы выражение не совпадало с "PI", однако мне не удалось это сделать.Чтобы уточнить, я бы хотел, чтобы следующие данные были действительными: _PI, abcPI, PIpipipi. Я просто не хочу принимать PI, когда он сам по себе.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Не очень приятно, но я все равно добавлю это для разнообразия:

/^([A-OQ-Za-z_][A-Za-z0-9_]*|P([A-HJ-Za-z0-9_][A-Za-z0-9_]*)?)$/
0 голосов
/ 23 февраля 2019

Прежде чем перейти к решению, взгляните на свое регулярное выражение: классы символов для отдельных диапазонов внутри групп чередования являются неэффективным способом написания шаблонов регулярных выражений.Вы можете просто объединить эти ([A-Z]|[0-9]|_)+ в [A-Z0-9_]+.

Решением может быть граница слова с отрицательным прогнозом после него:

r"\b(?!PI\b)[_a-zA-Z][_a-zA-Z0-9]*"

См. Демонстрационную версию regex .Вы можете заменить [a-zA-Z0-9_] на \w:

re.compile(r"\b(?!PI\b)[_a-zA-Z]\w*")          # In Python 2.x, re.UNICODE is not enabled by default
re.compile(r"\b(?!PI\b)[_a-zA-Z]\w*", re.A)    # In Python 3.x, make \w match ASCII only

Подробности

  • \b - граница слова
  • (?!PI\b) - сразу направо, не может быть PI как целого слова
  • [_a-zA-Z] - буква ASCII или _
  • [_a-zA-Z0-9]* - 0 или более знаков подчеркивания, ASCII буквы или цифры.
0 голосов
/ 23 февраля 2019

Отправка другого ответа: ^(((?!PI).)*)$|^.*(PI).+$|^.+(PI).*$

Я разбил его на 3 случая, используя ИЛИ |:

1) Соответствует строке, которая вообще не содержит PI.

^(((?!PI).)*)$

2) Соответствует строке, в которой есть PI, но за ней стоит хотя бы один символ и, возможно, любые символы впереди.

^.*(PI).+$

3) Соответствует строкев нем есть PI, но впереди есть хотя бы один символ и, возможно, любые символы позади него.

^.+(PI).*$

Вот с тестовыми примерами: https://regex101.com/r/7rzqpe/3

Пожалуйста, прокомментируйте, если вы нашли случай с отсутствующим краем.

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