Почему я не могу использовать re.sub для замены группы? - PullRequest
0 голосов
/ 21 февраля 2020

Моя цель - найти группу в строке, используя regex, и заменить ее пробелом.

Группа, которую я ищу, - это группа символов, только когда они попадают между строками. Когда я использую re.findall(), он работает точно так же, как и ожидалось

word = 'This##Is # A # Test#'
print(word)
re.findall(r"[a-zA-Z\s]*([\$\#\%\!\s]*)[a-zA-Z]",word)
>>> ['##', '# ', '# ', '']

Но когда я использую re.sub(), вместо замены группы он заменяет все регулярные выражения.

x = re.sub(r"[a-zA-Z\s]*([\$\#\%\!\s]*)[a-zA-Z]",r' ',word)
print(x)
>>> '    #'

Как я могу использовать регулярные выражения, чтобы заменить ТОЛЬКО группу? Результат, который я ожидаю:

'This Is A Test#'

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020

Проблема в том, что ваше регулярное выражение полностью соответствует неправильному.

x = re.sub(r'\b[$#%!\s]+\b', ' ', word)
0 голосов
/ 21 февраля 2020
  1. Во-первых, нет необходимости избегать каждого символа "волхвов c" в классе персонажей, [$#%!\s]* одинаково хорош и гораздо более читабелен.

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

  3. В-третьих, если вы хотите, чтобы в конце было только #, вы могли бы помочь себе с гораздо более простым выражением:

    (?:[\s#](?!\Z))+
    

    Что потребуется для замены пробелом см. демонстрацию на regex101.com .


    В Python это может быть:
    import re
    
    string = "This##Is # A # Test#"
    rx = re.compile(r'(?:[\s#](?!\Z))+')
    
    new_string = rx.sub(' ', string)
    print(new_string)
    # This Is A Test#
    
0 голосов
/ 21 февраля 2020

Вы можете сгруппировать части шаблона, которые хотите сохранить, и использовать вместо них обратные ссылки в строке замены:

x = re.sub(r"([a-zA-Z\s]*)[\$\#\%\!\s]*([a-zA-Z])", r'\1 \2', word)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...