2012-04-03 48 views
1

我希望评估类似于下面的结构:如何将正则表达式的转换或进行XOR

房子是绿色的,但我最喜欢的颜色是蓝色红色和黄色

我确定房子的颜色用正则表达式是这样的:

房子\ S +(\ W \ S *)+(=(青色|绿? |红色|蓝色))

它是做什么的?该表达式返回下一场比赛:

房子是绿色的,但我最喜欢的颜色是蓝色

也就是说,返回最后一个匹配字符串在列表CharacterClass颜色表示,即它需要等到RED出现,但你看到的第一种颜色是绿色。

我该怎么办?我正在寻找的只是采取列表中提到的第一种颜色,并停止寻找,那就是告诉我,房子的颜色是绿色的,没有别的。

问题1:如何遍历字符串,直到只显示一个表达式,也就是说,如何将表达式(青色或绿色或蓝色或红色)转换为行为列表像异或。重要提示:只使用正则表达式,即不使用任何como.NET背景语言,Java,PERL等...

Q2:是否有使用正则表达式的其他选择,我错过了。那就是,我采取的道路是正确的?

在前进,谢谢大家

+0

您可能需要从使用贪婪转换为非贪婪的正则表达式。不,我不知道如何在你的平台上做到这一点。你需要谷歌那一个。 – BoltBait 2012-04-03 23:28:27

回答

1

它返回最新的比赛,因为你(\w\s*)+贪婪;它尽可能匹配(即一直到“红色”之前)。

你可以将其改为非贪婪使用+?代替+

the house\s+(\w\s*)+?(?=(cyan|green|red|blue)) 

但我认为你可以做的更好。

为什么(\w\s*)+你可能只是一次匹配一个字母!为什么不匹配整个单词而不是(\w+\s+)+

此外,为什么不匹配到第一个颜色?

the\s+house\s+(\w+\s+)+?(cyan|green|red|blue) 

然后捕获组2(第二组括号)将包含青色,绿色,红色或蓝色(即你的颜色列表)的第一次出现。请注意0​​确保regex这个词不是贪婪的,这意味着它不会吞噬'青色','绿色','红色'或'蓝色'的实例。

你甚至可以只是做

house.*?\b(cyan|green|red|blue) 

.*?是非贪婪的,只是一切都狼吞虎咽起来,直到第一种颜色。例如,\b是一个“字边界”,只是确保正则表达式与'desi 红色'中的'红色'不匹配。

0

这是我怎么会做它在蟒蛇,即时通讯不知道其他语言有.seach功能。

“我正在寻找的是只取列表中提到的第一个色望而止步,”

s='The house is green but my favorite colors are blue red and yellow' 
import re 
print re.search('(cyan|green|red|blue)',s,).group(1) 
print re.match('The house is (cyan|green|red|blue)',s,).group(1)#or if u had to use the .match 

记在缺乏空间(青色|绿色|红色|蓝) 。

它打印此:

green 
green 
相关问题