#python #regex #python-3.x
#python #регулярное выражение #python-3.x
Вопрос:
В Python3 следующий код работает для замены строки (двух или более) из *
‘s на x
‘s.
import re
re.sub(r'*(?=*)|(?<=*)*', 'x', 'Replace this *** but not this *')
# 'Replace this xxx but not this *'
Но что, если я также хочу исключить строку из *
, которые являются частью «слова», как показано ниже? (Т.е. строка присоединена к одному или нескольким [a-zA-Z]
символам.)
text = "Don't replace foo*** or **bar, either."
# unmodified text expected
Как мне это сделать? Вероятно, я также могу сопоставить исключенные случаи и использовать функцию замены для их обработки, но есть ли способ получше?
Ответ №1:
regex = r"s*{2,}[sn]"
Это соответствует 2 или более *
символам, окруженным пробелом (или заканчивающимся новой строкой)
Возможно, назовите это так?
regex = r"s*{2,}[sn]"
def replacer(match):
return 'x' * len(match.group())
re.sub(regex, replacer, your_string_here)
Комментарии:
1. Вы дали мне хорошую идею для использования функции replacer, но ваш шаблон, включающий пробелы в соответствие, похоже, превратится
this **** string
вthis******string
, чего я не хочу. Это также не заменило бы**** this string
, что я действительно хочу заменить. Тем не менее, теперь у меня есть решение, которое работает благодаря вам. Спасибо.
Ответ №2:
Этот ответ вдохновлен Даниэль М. Этот шаблон ниже, кажется, дает мне то, что я хочу. Остальное такое же, как у нее.
regex = r'(?<![a-zA-Z])*{2,}(?![a-zA-Z])'