2017-06-01 115 views
1

這裏的骨感:你如何使一個字符集匹配不是一個以前被捕獲的字符?想你知道Python RE嗎?這裏是一個挑戰

r'(.)[^\1]' # doesn't work 

這是呃......胖?它是(簡單)加密程序的一部分。假設「hobo」被編碼爲「fxgx」。該方案只得到了編碼的文本,有推測它可能是什麼,所以它產生的模式:

r'(.)(.)(.)\2' # 1st and 3rd letters *should* be different! 

現在它(正確)匹配「流浪漢」,也符合「HOHO」(想想吧!)。我試過的東西,如:

r'(.)([^\1])([^\1\2])\2' # also doesn't work 

MANY的改變,但是唉!啪...

請幫忙!

P.S.解決方法(我必須實現)只是檢索「hobo」以及「hoho」,然後只是過濾結果(丟棄「hoho」s),if你明白我的意思;)

PPS現在我想HOHO

VVVVV答案VVVVV

是的,我重新 -re-閱讀文檔,它並說:

在字符類的'['和']'內部,所有數字轉義字符都是 作爲字符對待。

除了:

特殊字符失去裏面套了特殊的意義。

其中相當多的手段(我認爲)不,你不能做任何事情一樣:

re.compile(r'(.)[\1]') # Well you can, but it kills the back-reference! 

感謝您的幫助!

+1

使用包含反向引用的負向前視。 – Barmar

+0

您正在使用錯誤的工具完成任務。在方括號中加入反向引用是錯誤的。 –

+0

要匹配一個字符串與所有不同的字母,你應該使用一個集合,並檢查不同字符的計數。用正則表達式,你可能會實現它,但隨着任意數量的字符只是一個矯枉過正。要匹配以3個不同字母開頭的單詞,請使用're.match(r'([az])(?!\ 1)([az])(?!\ 1 | \ 2)([az])' ,s)' –

回答

3

第一個和第三個字母應該不一樣!

這不能使用正則表達式(不只是python的實現)檢測到。更具體地說,不能使用沒有存儲器的自動機來檢測。你將不得不使用不同類型的自動機。

你試圖發現的語法類型(重疊)不規則。而且,它不是上下文無關的。

自動機是允許正則表達式匹配如此高效的機制。

+0

不知道自動機的含義是什麼,但是你是對的,不能用Python re做 – user1547581

+0

你不能用任何正則表達式實現它。不僅僅是Python。 –

+0

@ user1547581自動機是允許正則表達式匹配如此高效的機制。 –