Python регулярное выражение: соответствует строке, которой не предшествует или после которой следует слово с цифрами в нем - PullRequest
1 голос
/ 30 марта 2020

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

т.е.

Для следующего предложения

Сегодня 4 апреля. Ее зовут Апрель . Завтра 5 апреля.

Я бы хотел сопоставить только апрель (выделено жирным шрифтом) и заменить его на «ЧЕЛОВЕК», а результат должен быть примерно таким:

Сегодня 4 апреля. Ее зовут ЧЕЛОВЕК . Завтра 5 апреля.

Я пытался использовать это регулярное выражение:

(\w*(?<!\w*\d\w*\s)April(?!\s\w*\d\w*))

Тем не менее, я получил сообщение об ошибке:

error: look-behind requires fixed-width pattern

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Это одно из регулярных выражений, которое вы можете использовать:

(?:^\s+|[^\w\s]+\s*|\b[^\d\s]+\s+)(April)\b(?!\s*\w*\d)

с установленным флагом безразличного регистра. Целевое слово фиксируется в группе захвата 1.

Демо

Python. Модуль регулярных выражений выполняет следующие операции:

(?:           # begin non-cap grp
  ^           # match beginning of line
  \s*         # match 0+ whitespace characters
  |           # or
  [^\w\s]+    # match 1+ chars other than word chars and whitespace
  \s*         # match 0+ whitespace chars
  |           # or
  \b          # match word break
  [^\d\s]+    # match 1+ chars other than digits and whitespace
  \s+         # match 1+ whitespace chars
)             # end non-cap grp  
(April)       # match 'April' in capture group
\b            # match word break
(?!           # begin negative lookahead
  \s*         # match 0+ whitespace chars         
  \w*         # match 0+ word chars
  \d          # match a digit
)             # end negative lookahead

Подход, который я выбрал, заключался в том, чтобы указать, что может предшествовать "April", а почему не может следовать за ним. Я не могу указать, что не может предшествовать "April", так как для этого потребуется отрицательный взгляд назад, который не поддерживается механизмом регулярных выражений Python.

Я предположил, что "April" может:

  • находиться в начале строки, за которой, возможно, следуют пробелы;
  • должен предшествовать символ, который не является ни символом слова, ни пробелом, возможно, сопровождаемый пробелами; или
  • должно предшествовать слово, не содержащее цифр, возможно, за которым следуют пробелы.

Я также предположил, что за "April" следует слово break, за которым нельзя следовать словом, содержащим ди git, возможно, с предшествующими пробелами.

1 голос
/ 30 марта 2020

Это можно сделать с помощью библиотеки регулярных выражений Pypi , которая поддерживает просмотр переменной длины.

import regex

str = 'Today is 4th April. Her name is April. Tomorrow is April 5th.'
res = regex.sub(r'(?<!\d[a-z]* )April(?! [a-z]*\d)', 'PERSON', str)
print(res)

Вывод:

Today is 4th April. Her name is PERSON. Tomorrow is April 5th.

Объяснение:

(?<!\d[a-z]* )      # negative lookbehind, make sure we haven't a digit followed by 0 or more letters and a space before
April               # literally
(?! [a-z]*\d)       # negative lookahead, make sure we haven't a space, 0 or more letters and a digit after

Обновление с помощью re модуля:

import re

str = 'Today is 4th April. Her name is April. Tomorrow is April 5th.'
res = re.sub(r'(\b[a-z]+ )April(?! [a-z]*\d)', '\g<1>PERSON', str)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...