说,我有一个简单的字符串
str = "hello hello hello 123"
在Python中,我想用"hello"
替换所有名为"<>"
的单词,我使用
re.sub("\bhello\b",'<>',str)
在Ruby 1.8.7中,我使用
str.gsub!(/\bhello\b/,'<>')
但是,Ruby解释器按预期工作,正确地更改所有名为hello的WORDS。但是,Python并没有 - 它甚至不能识别一个叫做hello的单词。
我的问题是:
答案 0 :(得分:5)
Python字符串将反斜杠解释为转义码; \b
是退格符。要么使用反斜杠加倍,要么使用原始字符串文字:
re.sub("\\bhello\\b", '<>', inputstring)
或
re.sub(r"\bhello\b", '<>', inputstring)
比较
>>> print "\bhello\b"
hello
>>> print r"\bhello\b"
\bhello\b
>>> len("\bhello\b"), len(r"\bhello\b")
(7, 9)
请参阅Python正则表达式HOWTO的The Backslash Plague section:
如前所述,正则表达式使用反斜杠字符(
'\'
)来表示特殊表单或允许使用特殊字符而不调用它们的特殊含义。这与Python在字符串文字中用于相同目的的相同字符的使用相冲突。[...]
解决方案是使用Python的原始字符串表示法来表示正则表达式;在前缀为
'r'
的字符串文字中,不会以任何特殊方式处理反斜杠,因此r"\n"
是包含'\'
和'n'
的双字符字符串,而"\n"
}是一个包含换行符的单字符字符串。正则表达式通常使用这种原始字符串表示法用Python代码编写。
演示:
>>> import re
>>> inputstring = "hello hello hello 123"
>>> re.sub("\bhello\b", '<>', inputstring)
'hello hello hello 123'
>>> re.sub(r"\bhello\b", '<>', inputstring)
'<> <> <> 123'
答案 1 :(得分:4)
你必须使它成为一个原始字符串,因为python以不同的方式解释\b
和<>
>>> s = "hello hello hello 123"
>>> import re
>>> re.sub(r"\bhello\b",r'<>',s)
'<> <> <> 123'*
注意 - 切勿将字符串命名为str
,因为它会覆盖内置功能。</ p>