re.sub () ведет себя странно, когда указано имя группы - PullRequest
0 голосов
/ 22 октября 2018

Я хотел заменить точки ('.') последовательностью символов, например, foo.bar> fooDOTbar, но только если точка не находилась между двумя числами, например, 0.9> 0.9.Итак, я сделал:

regex = re.compile(r'([a-zA-Z])(?P<dot>\.)([a-zA-Z])')
input_str = 'foo.bar'
output = regex.sub(r'DOT\g<dot>', input_str)

print(output)
'foDOT.ar'

Что совсем не то, что я ожидал.Я попытался заменить .sub() на .search(), похоже, он работает нормально (match.group('dot') возвращает '.').

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Или без использования группы:

import re
regex = re.compile(r'(?<=[a-zA-Z])(\.)(?=[a-zA-Z])')
input_str = 'foo.bar'
output = regex.sub(r'DOT', input_str)

print(output)

Вывод:

fooDOTbar
0 голосов
/ 22 октября 2018

Зачем вам именованный захват для того, что вы знаете, что вы собираетесь выбросить?Я говорю о (?P<dot>\.).Вот как вы это сделаете:

>>> regex = re.compile(r'(?P<before>[a-zA-Z])(\.)(?P<after>[a-zA-Z])')
>>> regex.sub(r'\g<before>DOT\g<after>', input)
'fooDOTbar'
...