шаблон соответствия регулярному выражению python3, но только если он не заканчивается определенным символом - PullRequest
2 голосов
/ 02 июля 2019

У меня есть вопрос о том, как заменить строковый шаблон, но только если он не заканчивается восклицательным знаком.

Например, «Спасибо, Боб» или «Спасибо, Боб». следует заменить на «Спасибо, [ИМЯ]», но «Спасибо, Боб!» НЕ следует заменять.

Пока у меня есть это:

regex = r"Thanks\,(\s)?(\n+)?[A-Z]?[a-z]+[^!]"
re.sub(regex, "Thanks, [NAME]", text)

Это работает для случая, когда у вас есть пунктуация после «Боба», но не работает для случая «Спасибо, Боб»

Есть идеи?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете использовать

(Thanks,\s*)[A-Z][a-z]+\b(?!!)

и заменить на \1[NAME].См. regex demo и regex graph :

enter image description here

Дело в том, что вам нужно использоватьграница слова \b после [a-z]+ и добавление отрицательный прогноз (?!!) сразу после .

Подробности

  • (Thanks,\s*) - Группа 1 (\1 в шаблоне замены): Thanks, и 0+ пробелов (\s*)
  • [A-Z][a-z]+ - прописные буквыбуква, а затем 1+ строчные
  • \b - граница слова, следующий символ не может быть буквой / цифрой / _
  • (?!!) - нет ! непосредственно надопускается право текущего местоположения.

Демо Python :

import re
rx = r"(Thanks,\s*)[A-Z][a-z]+\b(?!!)"
strs = ["Thanks, Bob", "Thanks, Bob.", "Thanks, Bob!"]
for s in strs: 
    print( re.sub(rx, r"\1[NAME]", s) )

Вывод:

Thanks, [NAME]
Thanks, [NAME].
Thanks, Bob!
0 голосов
/ 02 июля 2019

Полагаю, ваше выражение просто отлично, мы бы немного изменили его на:

^Thanks\s*,\s*([A-Z]?[a-z]*)\s*[^!]?$

Демо

Тест

import re

regex = r"^Thanks\s*,\s*([A-Z]?[a-z]*)\s*[^!]?$"

test_str = ("Thanks, Bob\n"
    "Thanks, Bob.\n"
    "Thanks, Bob!")

subst = "Thanks, [NAME]"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

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