2012-04-03 21 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 
相關問題