Как использовать регулярное выражение для удаления определенного раздела текста после совпадения регулярного выражения - PullRequest
0 голосов
/ 04 октября 2019

(Нет, Регулярное выражение Python, как удалить все совпадения из строки не решает мою проблему)

Предположим, у меня есть этот список:

names = ['your name', 'the name', 'his name', 'her name', 'their name', 'employer name', "employer's name", "father's name",
        "mother's name", "maiden name", "son's name", "daughter's name", "brother's name", "sister's name"]

И предположим, у меня есть этот фрагмент текста:

text = "What is your name?  Well,  uh it's John Smith.  Thanks for asking. Anyway, I'd doing well."

Как использовать регулярные выражения, чтобы найти каждый элемент имен списка в тексте, и немедленно заменить блок текста (скажем, длиной 50)после элемента с «[имя]». Таким образом, мой вывод будет:

text = "What is your name [name] Anyway, I'd doing well."

Пока у меня есть этот код ниже, но он заменяет только элемент с «[name]», а не фактический текст после элемента.

def my_replace3(match):
    match = match.group()
    return " [name] "

def no_name(text):
    names = ['your name', 'the name', 'his name', 'her name', 'their name', 'employer name', "employer's name", "father's name",
        "mother's name", "maiden name", "son's name", "daughter's name", "brother's name", "sister's name"]
    regex = re.compile(r'\b(' + '|'.join(names) + r')\b', re.IGNORECASE)
    text = re.sub(regex, my_replace3, text)
    return text

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

1 Ответ

1 голос
/ 04 октября 2019

Если вы хотите заменить 50 символов после совпадения, добавьте .{50} к регулярному выражению.

Затем используйте обратную ссылку в строке замены, чтобы скопировать соответствующую строку в замену.

def no_name(text):
    names = ['your name', 'the name', 'his name', 'her name', 'their name', 'employer name', "employer's name", "father's name",
        "mother's name", "maiden name", "son's name", "daughter's name", "brother's name", "sister's name"]
    regex = re.compile(r'\b(' + '|'.join(map(re.escape, names)) + r')\b.{50}', re.IGNORECASE)
    text = re.sub(regex, r'\1 [name]', text)
    return text

Вы также должны использовать re.escape() при вставке строк, которые должны точно совпадать с регулярным выражением, в случае, если какие-либо из них содержат операторы регулярного выражения.

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