2013-05-03 152 views
2

我想使用Python正則表達式來獲取字符分隔字符串的第一個標記。我不想將反斜槓分隔符視爲真正的分隔符,所以我使用了負向後置斷言。當分隔符是逗號時,它可以毫無問題地工作。撇號內部撇號斷言

>>> 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並不表示'是一個特殊字符,所以我真的想知道,爲什麼我的'對待不同?

(請,沒有評論:誰希望有一個撇號分隔的文件嘛...我...。)在

+0

很奇怪。似乎'ord(「\'」)'和'ord(「'」)'之間沒有區別。您是否在搜索字符串中嘗試了一個非轉義的單引號? – dsummersl 2013-05-03 11:10:46

+0

不,沒有 - 逃脫一個非轉義角色只是給你那個角色。 – katrielalex 2013-05-03 11:12:06

回答

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

結果:

"'" '\\,' 

正如你可以看到"\'"不是其實有一個\\在裏面。因此,當你將其更改爲"\\'"匹配的模式生產:

Hello\' world! 

"\'"實際上是一個escape sequence

\ '單引號(')

顯然,原因

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

是因爲"\'"相當於"'"。它是有道理的\'是一個轉義序列:

>>> 'i\'ll' 
"i'll" 
+0

謝謝。剛剛也找到了。但是,我很驚訝這種行爲對''來說並不一樣。 – 2013-05-03 11:20:08

+0

@GerardYin請看我的編輯:) – HennyH 2013-05-03 11:20:26

+0

好的。得到它了。的確,這是有道理的。 – 2013-05-03 11:21:24