2013-05-02 67 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可以用来匹配是这样的:

  • “苹果香蕉橘子”
  • “苹果橙”
  • “苹果香蕉”
  • “香蕉苹果”

或任何输入列表的笛卡尔积。