2014-08-27 62 views
1

我想比較Python中的兩個正則表達式。匹配彼此的兩個正則表達式

基本上,我需要測試一個表達式是否包含在另一個表達式中。

例如,在[AB] [CD]中包含[AB] D。或者是...... K。。包括在... [KR] ..

我試圖像下面,但它不工作:

re.finditer(r"[AB][DF]",r"[AB]D") 
re.finditer(r"[AB]D",r"[AB][CD]") 

我的表達可以有不同的大小,但一具有相同尺寸表達的解決方案將非常棒。

編輯

我所有的正則表達式是prety簡單。

它們只包含「點」,「方形布拉」和「^」。

。指(實際正則表達式,如*) 「什麼」
[AB]表示 「A或B」
[^ P]表示 「不是P」

EDIT 2

謝謝您的回答和評論,我想我會從一個正則表達式生成所有字符串的集合,並用第二個正則表達式來測試它們。

+0

如果一個字符串與另一個字符串中的'if first_string in second_string'一起可以找到。或者當你說「被包含」時,你的意思是什麼? – Kevin 2014-08-27 15:42:28

+0

你需要解決* general *問題(任何正則表達式)還是簡單的表達式,看起來像你的,即[AB] D'和'[AB] [CD]'變種?後一個問題會很簡單。 – DSM 2014-08-27 15:48:19

+0

提出的重複問題不是恆星,但答案是。 – tripleee 2014-08-27 16:08:03

回答

5

你可以做到這一點,但你必須自己做。這是很多工作,你可能會認爲這是不值得的。以下是您可以執行此操作的方法:

  1. 將正則表達式A和B轉換爲NFA。

  2. (a,b)是NFA表單中兩個正則表達式的初始狀態的集合。

  3. 取兩套的epsilon關閉,(e(a),e(b))

  4. 對於每個符號,遵循所有轉變從E(A)和È(b)中沿符號該符號,以形成一個新的狀態,(A 'B')

  5. 回到第三步。

最終,您將爲所有正則表達式恢復所有可能的狀態集。如果在任何點E(b)中含有最終狀態,但E(一)沒有,那麼B不是在A.包含

這是保證終止,因爲有套的有限數目狀態。這種技術不適用於反向引用。技術上如果您使用反向引用,那麼它們不再是正則表達式,至少從正式語言的角度來看。

+0

+1這還要求表達式是* true *正則表達式,而不是使用擴展正則表達式中可用的任何前瞻或回溯斷言。 – chepner 2014-08-27 15:58:16

+0

感謝您的回答。這對於我想要做的事來說很複雜。就我而言,我認爲比較一個正則表達式的所有可能表達式會更容易。正如我在編輯中所解釋的,我的正則表達式非常簡單。 – 2014-08-27 16:25:05