re.sub "(-)" не удалось - PullRequest
       1

re.sub "(-)" не удалось

1 голос
/ 23 марта 2012

Я не могу заменить строку "(-)" с помощью re.sub в Python.

>>> instr = 'Hello, this is my instring'
>>> re.sub('my', 'your', instr)
'Hello, this is your instring'
>>> instr = 'Hello, this is my (-) instring'
>>> re.sub('my (-)', 'your', instr)
'Hello, this is my (-) instring'

Может кто-нибудь подсказать, что я делаю не так.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 23 марта 2012
re.sub(r'my \(-\)', 'your', instr)

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

Или вообще не используйте regexp (если ваша замена настолько проста), и вам не нужно заботиться о многих проблемах:

>>> instr = 'Hello, this is my (-) instring'
>>> instr.replace('my (-)', 'your')
'Hello, this is your instring'
3 голосов
/ 23 марта 2012

Вам нужно экранировать '(-)', потому что это совпадение с шаблоном регулярного выражения, что касается механизма регулярных выражений.Если вы не знаете, как убежать, но ваша строка не имеет реальных шаблонов, но должна быть дословно истолкована, вы должны сделать:

>>> re.sub(re.escape('my (-)'), 'your', instr)
'Hello, this is your instring'

или если ваша строка представляет собой смесь между "простой "шаблон и сложные вещи, вы можете сделать это:

>>> re.sub('[a-z]{2} %s' % re.escape('(-)'), 'your', instr)
'Hello, this is your instring'
2 голосов
/ 23 марта 2012

Один из способов отладки подобных вещей - использовать флаг re.DEBUG :

>>> import re

>>> p = re.compile("my (-)", re.DEBUG)
literal 109 # chr(109) == "m"
literal 121 # chr(121) == "y"
literal 32 # chr(32) == " "
subpattern 1 # a group
  literal 45 # chr(45) == "-"
<_sre.SRE_Pattern object at 0x1004348a0>

Так что это соответствует "-" в группе, где нет совпадений длялитерал (, по сравнению с:

>>> re.compile(r"my \(-\)", re.DEBUG)
literal 109
literal 121
literal 32
literal 40 # chr(40) == "(", not a group this time
literal 45
literal 41
<_sre.SRE_Pattern object at 0x10043ea48>

(материал, добавленный мной после #, не выводится в результате отладки)

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