我无法使用Python中的re.sub替换字符串“( - )”。
>>> 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'
有人可以给我一个提示我做错了什么。
谢谢!
答案 0 :(得分:6)
re.sub(r'my \(-\)', 'your', instr)
您必须转义括号,通常用于匹配组。此外,在字符串前添加r
以保持原始(因为反斜杠)。
或者根本不使用正则表达式(如果你的替换那么简单)并且你不必关心很多问题:
>>> instr = 'Hello, this is my (-) instring'
>>> instr.replace('my (-)', 'your')
'Hello, this is your instring'
答案 1 :(得分:3)
您需要转义'(-)'
,因为就正则表达式引擎而言,它是正则表达式模式匹配。如果你不确定如何逃避,但你的字符串没有任何实际模式,但应该逐字解释,你应该这样做:
>>> 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 :(得分:2)
调试此类事情的一种方法是使用re.DEBUG
flag:
>>> 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>
(#
之后的东西是我添加的,它不是来自调试输出)