2015-05-25 44 views
2

我有一個小小的問題,下面的代碼。奇數或偶數的反斜槓和溢出字符

import re 

pattern = re.compile(r"((?:^|[^\\@]|\\.)+)@") 

for text in [ 
    r"[email protected]\@.py", 
    r"[email protected]\\@.py", 
    r"[email protected]\\\@.py", 
    r"[email protected]\\\\@.py", 
    r"[email protected]\\\\\@.py", 
]: 
    search = re.search(pattern, text) 
    print('---', text, sep="\n") 

    if search: 
     print(pattern.sub(r"\1<star>", text)) 

    else: 
     print('<< NOTHING FOUND ! >>') 

此打印:

--- 
[email protected]\@.py 
ok<star>\@.py 
--- 
[email protected]\\@.py 
ok<star>\\<star>.py 
--- 
[email protected]\\\@.py 
ok<star>\\\<star>.py 
--- 
[email protected]\\\\@.py 
ok<star>\\\\<star>.py 
--- 
[email protected]\\\\\@.py 
ok<star>\\\\\<star>.py 

問題與第3個輸出是錯誤的,因爲首先是一個轉義的反斜槓,然後轉義字符@開始。這個問題繼續與更多的反斜槓:剛纔看到最後的輸出有兩個逃跑反斜槓,然後轉義字符@ ..

這裏是預期的輸出,其中@的確逃脫只有當有奇數個\之前它。

--- 
[email protected]\@.py 
ok<star>\@.py 
--- 
[email protected]\\@.py 
ok<star>\\<star>.py 
--- 
[email protected]\\\@.py 
ok<star>\\\@.py 
--- 
[email protected]\\\\@.py 
ok<star>\\\\<star>.py 
--- 
[email protected]\\\\\@.py 
ok<star>\\\\\@.py 

我的正則表達式有什麼問題,以及如何解決它?

+3

你還沒有告訴我們預期的行爲。如果我們不知道它應該做什麼,我們將如何解決它? –

+0

@KarolyHorvath我已更新我的問題。 – projetmbc

回答

1

使用以下正則表達式:

pattern = re.compile(r"(?<!\\)((?:\\\\)*)@") 

而且只有<star>

輸出替換:

ok<star>\@.py 
ok<star>\\<star>.py 
ok<star>\\\@.py 
ok<star>\\\\<star>.py 
ok<star>\\\\\@.py 

DEMO

+0

事實上,輸出會改變是否存在偶數或反數的反斜槓。 – projetmbc

+0

我已經更新了我的問題,說明了先前的問題,但我並不十分清楚,只有在出現奇數個\之前,@纔會被轉義。 – projetmbc

+1

@projetmbc檢查更新.. –