2013-05-02 66 views
0

給定一組可能以任意順序出現的空格分隔單詞,我如何才能匹配給定單詞集中的單詞。例如說我有:re:匹配集合中重複的任何單詞

apple monkey banana dog和我想匹配applebanana我該怎麼做?

這是我已經試過:

m = re.search("(?P<fruit>[apple|banana]*)", "apple monkey banana dog") 
m.groupdict() --> {'fruit':'apple'} 

但我想蘋果和香蕉相匹配。

回答

1

(?P<fruit>[apple|banana]*)

[蘋果|香蕉] *定義一個字符類,例如此標記匹配一個,一個p,一個l,一個e,一個|,一個b或一個n,然後說'匹配0次或多次'。 (無論如何,這可能意味着'匹配一次或多次')

你想要的是(蘋果|香蕉)它將匹配字符串蘋果或字符串香蕉。

瞭解更多:http://www.regular-expressions.info/reference.html

你的下一個問題,讓所有匹配的正則表達式使得對一個字符串,而不僅僅是第一,使用http://docs.python.org/2/library/re.html#re.findall

+0

我試過了,你的權利確實匹配字符串蘋果或香蕉我需要它匹配蘋果和香蕉重複零次或多次。也許我應該澄清更多。 – 2013-05-02 02:21:40

+0

@ john-charles無論如何,你的正則表達式是有缺陷的,你早晚會發現:)我已經修改了我的答案,並給出了你之後的答案。 – Patashu 2013-05-02 02:22:09

+0

不,我的意思是零次或多次。無論如何,無法在相同的正則表達式中乘法匹配特定單詞?這只是我需要用正則表達式做的一部分。使用findall將需要我找到然後應用另一個正則表達式到每個找到的匹配。 – 2013-05-02 02:28:19

0

如果你希望它能夠重複,你將在白色空間失敗。試試這個:

input = ['apple','banana','orange'] 
reg_string = '(' + ('|').join(input) + ')' 
lookahead_string = '(\s(?=' + ('|').join(input) + '))?' + reg_string + '?' 
out_reg_string = reg_string + (len(input)-1)*lookahead_string 
matches = re.findall(out_reg_string, string_to_match) 

其中string_to_match是你正在尋找的模式。 out_reg_string可以用來匹配是這樣的:

  • 「蘋果香蕉橘子」
  • 「蘋果橙」
  • 「蘋果香蕉」
  • 「香蕉蘋果」

或任何輸入列表的笛卡爾積。