2015-07-20 135 views
3

我嘗試在字符串中查找符合條件的所有子字符串。查找包含至少一個組的所有子字符串

比方說,我們已經有了字符串:

s = 'some text 1a 2a 3 xx sometext 1b yyy some text 2b.' 

我需要應用的搜索模式{(一個(組詞),兩個(另一個組詞),三(另一組詞)) ,詞}。前三個職位是可選的,但至少應該有一個職位。如果是這樣,我需要一個字。 輸出應爲:

2a 1a 3 xx 
1b yyy 
2b 

我寫此表達式:

find_it = re.compile(r"((?P<one>\b1a\s|\b1b\s)|" + 
        r"(?P<two>\b2a\s|\b2b\s)|" + 
        r"(?P<three>\b3\s|\b3b\s))+" + 
        r"(?P<word>\w+)?") 

每組包含設置或不同的單詞(未1A,1B)。我不能將它們混合成一個組。如果組爲空,它應該是None。顯然結果是錯誤的。

find_it.findall(s) 
> 2a 1a 2a 3 xx 
> 1b 1b yyy 

我很感謝您的幫助!

回答

0

您可以使用下面的正則表達式:

>>> reg=re.compile('((?:(?:[12][ab]|3b?)\s?)+(?:\w+|\.))') 
>>> reg.findall(s) 
['1a 2a 3 xx', '1b yyy', '2b.'] 

在這裏,我只是用字符類和改性劑?。以下正則表達式是包含2部分凝練你的正則表達式:

[12][ab]|3b? 

[12][ab]將匹配1a1b,2a,2b3b?將匹配3b3

如果你不想在2b末點,你可以使用一個positive look ahead是更普遍比之前的正則表達式使用正則表達式如下(因爲製作\s可選不在第一組是個好主意):

>>> reg=re.compile('((?:(?:[12][ab]|3b?)\s)+\w+|(?:(?:[12][ab]|3b?))+(?=\.|$))') 
>>> reg.findall(s) 
['1a 2a 3 xx', '1b yyy', '2b'] 

此外,如果你的號碼,例如子只是情況下,你可以使用[0-9][a-z]作爲一般的正則表達式:

>>> reg=re.compile('((?:[0-9][a-z]?\s)+\w+|(?:[0-9][a-z]?)+(?=\.|$))') 
>>> reg.findall(s) 
['1a 2a 3 xx', '1b yyy', '5h 9 7y examole', '2b'] 
+0

對不起!可能我的問題被錯誤地定義,但1a,1b,2a,3等 - 是完全不同的單詞。我只是將它們組合在一起以簡化視圖。 –

+0

@KatrinaMalakhova檢出編輯! – Kasramvd

+0

它的工作原理)。但通過這種方式,所有團體都是平等的。如果我需要區分它們呢? –

相關問題