Python lookbehind断言中的撇号

时间:2013-05-03 11:03:13

标签: python regex

我正在尝试使用Python正则表达式来获取字符分隔字符串的第一个标记。我不想将反斜杠分隔符视为真正的分隔符,所以我使用负面的lookbehind断言。当分隔符是逗号时,它可以正常工作。

>>> import re
>>> re.match("(.*?)(?<!\\\\),.*", "Hello\, world!,This is a comma separated string,Third value").groups(1)[0]
'Hello\\, world!'

而用逗号替换逗号的完全相同的代码根本不起作用。

>>> import re
>>> re.match("(.*?)(?<!\\\\)'.*", "Hello\' world!'This is an apostrophe separated string'Third value").groups(1)[0]
'Hello'
>>>

我正在使用python 2.7.2,但我对Python 3有相同的行为(在Ideone上测试)。 Python re documentation并不表示'是一个特殊字符,所以我真的很想知道,为什么我的'处理方式不同?

(请,没有评论:谁会想要一个撇号分隔的文件。嗯......我做......)

1 个答案:

答案 0 :(得分:4)

print(repr("\'"),repr("\,"))

结果:

"'" '\\,'

正如您所看到的,"\'" 实际中没有\\。因此,当您将其更改为"\\'"时,模式匹配生成:

Hello\' world!

"\'"实际上是escape sequence

  

\'单引号(')

显然,原因

>>> ord("\'") == ord("'")
True

是因为"\'" 等同于"'"。有意义\'是一个转义序列:

>>> 'i\'ll'
"i'll"