2016-08-03 82 views
3

這裏是正則表達式我到目前爲止:正則表達式多正前瞻組

^(?=.*(option1|option2))(?=.*(option3|option4))(?=.*(option5|option6))(?=.*(option7|option8))(?=.*(option9|option10)).*$ 

我不是在正則表達式語言臀部,所以我會做我自己的定義:

類1 (選項1 |選項2),類別2是(選項3 |選項4),類別3是(選項5 |選項6)等

我想捕獲值,其中3個或更多的類別中至少有一個選項是發現,像這樣:

一些文字2選項一些文字選項8一些文字選項1

OR

一些文字2選項一些文字選項8一些文字選項1一些文字選項6

我不想捕捉值是這樣的:

一些文字2選項一些文字選項8 - 只有2個類別中表示

OR

一些文字2選項一些文字3選項更多文本選項1(選項3和4來自同一類別)

這些選項可以在文本中以任意順序出現,所以這就是爲什麼我使用了積極的向前看,但我不知道如何將量詞放在多個積極的lookahead上。

就正則表達式引擎而言,我必須使用由後臺python驅動的前端UI。我只能使用正則表達式,我沒有能力使用任何其他的Python函數。謝謝!

回答

1

這裏有一個正則表達式,做你想做的(在VERBOSE模式):

^ 
(?= .* (?: option1 | option2) ())? 
(?= .* (?: option3 | option4) ())? 
(?= .* (?: option5 | option6) ())? 
(?= .* (?: option7 | option8) ())? 
(?= .* (?: option9 | option10)())? 
.*$ 
(?: \1\2\3 | \1\2\4 | \1\2\5 | \1\3\4 | \1\3\5 | 
    \1\4\5 | \2\3\4 | \2\3\5 | \2\4\5 | \3\4\5) 

空的組用作複選框:如果封閉式超前檢查未成功,則反向引用該組將不會成功。最後的非捕獲組包含三個五個反向引用的所有可能的組合。

這種方法的侷限性很明顯;您只需添加一組option即可完全失控。我認爲你最好用非正則表達式解決方案。

+0

謝謝你的解決方案!你能否再解釋一下VERBOSE模式是什麼?我必須使用的前端UI不允許更改爲VERBOSE模式。這可以用python的默認模式編寫(不知道是什麼)。 –

+0

您可以在開頭添加'(?x)',在正則表達式中指定VERBOSE模式。或者你可以從正則表達式中刪除所有的空白:'^(?=。*(?: option1 | option2)())?(?=。*(?: option3 | option4)())?(?=。* (?:選項5 |選項6)())(= *(?:選項7 |選項8?)())(= *(?:選項9 | option10?)())* $(?:???\ 1 \ 2 \ 3 | \ 1 \ 2 \ 4 | \ 1 \ 2 \ 5 | \ 1 \ 3 \ 4 | \ 1 \ 3 \ 5 | \ 1 \ 4 \ 5 | \ 2 \ 3 \ 4 | \ 2 \ 3 \ 5 | \ 2 \ 4 \ 5 | \ 3 \ 4 \ 5)' –

+0

太棒了!非常感謝! –

1

我不認爲這是可以與正則表達式實現,或者如果它(可能在某些步驟),它不是一個正確的方式去。

相反,你可以存儲在一組喜歡你的選擇:

options = {(option1, option2), (option3, option4), (option5, option6), (option7, option8), (option9, option10)} 

然後檢查成員像以下:

if sum(i in my_text or j in my_text for i, j in options) >= 3: 
    # do something 

這裏是一個演示:

>>> s1 = "some text option8 some more text option3 some more text option1" 
>>> s2 = "some text option3 some more text option4 some more text option1" 
>>> s3 = "some text option3 some more text option8" 
>>> 
>>> options = {('option1', 'option2'), ('option3', 'option4'), ('option5', 'option6'), ('option7', 'option8'), ('option9', 'option10')} 
>>> 
>>> sum(i in s1 or j in s1 for i, j in options) 
3 
>>> sum(i in s2 or j in s2 for i, j in options) 
2 
>>> sum(i in s3 or j in s3 for i, j in options) 
2