Заменять символ другим, только если он повторяется и не является частью слова

#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])'