正则表达式在Python和Ruby中的工作方式不同

时间:2015-02-27 13:27:07

标签: python ruby regex string

说,我有一个简单的字符串

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的单词。

我的问题是:

  • 为什么会有差异?
  • 如何在Python中获得相同的功能?

2 个答案:

答案 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>