Обратное совпадение регулярного выражения в группе в Python - PullRequest
3 голосов
/ 10 июля 2020

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

Учитывая список слов, я хочу напечатать все слова, которые не имеют специальных символов.

У меня есть регулярное выражение, которое идентифицирует слова с помощью специальных символов \w*[\u00C0-\u01DA']\w*. Я видел много ответов с довольно простым сценарием ios, например, простым словом . Однако мне не удалось найти ничего, что отрицает группу - я видел несколько разных наборов синтаксиса для включения отрицательного просмотра вперед ?!, но мне не удалось придумать синтаксис, который работает с это.

В моем случае с такой строкой, как: «should print nŌt thìs»

должны печатать should и print, но не два других слова. re.findall("(\w*[\u00C0-\u01DA']\w*)", paragraph.text) дает вам специальные символы - я просто хочу их инвертировать.

1 Ответ

5 голосов
/ 10 июля 2020

В этом конкретном случае вы можете просто указать обычный алфавитный диапазон в поиске:

a = "should print nŌt thìs"
re.findall(r"(\b[A-Za-z]+\b)", a)
# ['should', 'print']

Конечно, вы можете добавить цифры или что-нибудь еще, что вы хотите сопоставить.

Что касается отрицательного просмотра вперед, они используют синтаксис (?!...) с ? перед !, и они должны быть в круглых скобках. Чтобы использовать его здесь, вы можете использовать:

r"\b(?!\w*[À-ǚ])\w*"

Это:

  • Проверяет границу слова \b, например пробел или начало входной строки.
  • Выполняет отрицательный просмотр вперед и останавливает сопоставление, если обнаруживает какой-либо специальный символ, которому предшествует 0 или более символов слова. Вы должны включить \w*, потому что (?![À-ǚ]) будет проверять только специальный символ, являющийся первой буквой в слове.
  • Наконец, если он проходит мимо просмотра вперед, он соответствует любым символам слова.

Демо . Обратите внимание, что на regex101.com вы должны указать Python аромат для \b, чтобы правильно работать со специальными символами.

Также есть третий вариант:

r"\b[^À-ǚ\s]*\b"

Средняя часть [^À-ǚ\s]* означает соответствие любому символу , кроме специальных символов или пробелов, неограниченное количество раз.

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