2013-11-21 68 views
0

我想捕獲序列' AE'(如果有)或位於序列' BE'之前的單詞(如果有的話)或兩個單詞(如果兩個序列都出現在字符串中)之前的單詞。捕獲兩個可選組

我試圖用以下正則表達式:

TEST = re.compile(
    r'(.*?)' 
    r'(?:(\w+) AE)?' 
    r'.*?' 
    r'(?:(\w+) BE)?') 

它捕獲任一前述' BE'或字前述' AE'但不 兩個單詞的單詞。

>>> TEST.match('').groups() 
('', None, None) 
>>> TEST.match('foo AE').groups() 
('', 'foo', None) 
>>> TEST.match('foo BE').groups() 
('', None, 'foo') 
>>> TEST.match('foo AE bar BE').groups() 
('', 'foo', None) 

相反,我想輸出的最後一行是

>>> TEST.match('foo AE bar BE').groups() 
('', 'foo', 'bar') 
+2

're.findall'在這裏很有用。 –

回答

1

使用RegexObject.findall

>>> pattern = re.compile(r'\s*(.*?)\s*(?:AE|BE)') 
>>> 
>>> pattern.findall('') 
[] 
>>> pattern.findall('bar BE') 
['bar'] 
>>> pattern.findall('foo AE') 
['foo'] 
>>> pattern.findall('foo AE bar BE') 
['foo', 'bar'] 
+1

編譯模式通常是不必要的。從文檔「最近傳遞給're.match()','re.search()'或're.compile()'的最新模式的編譯版本被緩存,因此只使用少數正則表達式的程序一段時間不用擔心編譯正則表達式。「 –

+0

@StevenRumbalski,謝謝你的評論。我只是不想在答案中多次重複相同的模式,並希望保持OP的代碼風格。 – falsetru

+0

不理想,因爲只有一個組匹配時,我不知道它是哪一個(AE或BE?)。 –