2013-07-30 111 views
0

我有一個字符串:Python的正則表達式 - 匹配多個表達組

property1=1234, property2=102.201.333, property3=abc 

我想捕捉1234和102.201.333。我正在嘗試使用正則表達式:

property1=([^,]*)|property2=([^,]*) 

但它只管理捕獲其中一個值。基於 this link我也試過:

((?:property1=([^,]*)|property2=([^,])+) 
(?:(property1=([^,]*)|property2=([^,])+) 

他們從什麼地方我不捕獲額外的組。

我錯過了什麼?

P.S.我正在使用re.search()。

編輯:可能有一些錯誤的,我調用代碼:

m = re.search('property1=([^,]*)|property2=([^,]*)', text); 
print m.groups() 

EDIT2:它不必是propertyX。它可以是任何東西:

foo1=123, bar=101.2.3, foobar=abc 

即使

foo1=123, bar=weirdbar[345], foobar=abc 

回答

1

正則表達式對於像lexemes那樣行爲的事物來說非常適合,對於通用目的解析來說不是很好。

在這種情況下,雖然,它看起來像你的「配置-Y串」 可以組成形式的詞位序列的純粹:= [,= ...]。如果是這樣,你可以使用正則表達式和重複。雖然(在較小程度上,是否要檢查錯誤),但是正確的正則表達式取決於的確切形式。例如,是:

this="a string with spaces", that = 42, quote mark = " 

是否允許?如果是這樣,是this設置爲a string with spaces(不含引號)或"a string with spaces"(包括引號)?是that設置爲 42(它有一個前導空白)或只是42(這不)?是否允許使用quote mark(其中包含嵌入空格),並且是否設置爲一個雙引號?千萬雙引號,如果存在的話,「越獄」逗號,這樣你可以寫:

greeting="Hello, world." 

假設空間被禁止的,而部分是單純的「由\w匹配的字母數字」:

for word, value in re.findall(r'([\w]+)=([\w]+)', string): 
    print word, value 

這是從102.201.333價值明顯,\w不足以爲value比賽,雖然。如果是 「一切不是逗號」(包括空格),則:

for word, value in re.findall(r'([\w]+)=([^,]+)', string): 
    print word, value 

越來越近。這些都忽略「垃圾」,並禁止=標誌周圍的空間。如果string"$a=this, b = that, c=102.201.333,,",第二for循環打印:

a this 
c 102.201.333 

美元符號(未字母數字字符)被忽略,對於b值由於空白忽略,並且該值後的兩個逗號對於c也被忽略。

+0

那麼我用例是既比這更簡單和困難:因爲 它是簡單的: * Property1,Property2(即字)是已知的,硬編碼 *我可以用一定的誤差量活 這是困難的,因爲 *值可能很複雜(weirdbar [345,weirderbar [123]]) – SANDeveloper

+0

我意識到我正在嘗試更多的Deseriazl化而不是正則表達式解析。所以我正在轉向另一種方法。但我會將您的解決方案標記爲最完整的答案。 – SANDeveloper

0

您使用的是|。這意味着你的正則表達式將匹配欄左邊的東西或者右邊的東西。

0

你可以嘗試:

property_regex = re.compile('property[0-9]+=(?P<property_value>[^\s]+)') 

後等於空間之前簽署,並且將匹配任何財產。 property_value就像文件說,這將是從名字訪問:

python re documentation

例如複製,如果模式(P [A-ZA-Z _] \ W *?)時,組可以是 ,其名稱參照匹配對象的方法的參數,例如 作爲m.group('id')或m.end('id'),並且也可以通過名稱在常規 表達式本身中使用(使用?P = id))和替換文本給.sub() (使用\ g)。

0

試試這個:

property_regex = re.compile('property[0-9]+=([^\s]+)') 
+0

大聲笑是不是我正是這麼回答? – PepperoniPizza

+0

對不起,我在這裏過於簡單。它不一定是propertyX。它可以是任何東西 foo1 = 123,酒吧= 101.2.3,foobar = abc – SANDeveloper

1

作爲替代方案,我們可以使用一些字符串分割創建字典。

text = "property1=1234, property2=102.201.333, property3=abc" 
data = dict(p.split('=') for p in text.split(', ')) 
print data["property2"] # '102.201.333' 
+0

有趣的,可能會用這個作爲最後的手段。 – SANDeveloper

0

我已經嘗試建立了你一個正則表達式,這將給你property1 =和property2後的值,但我不知道你如何在Python中使用它們。

編輯

現在捕獲除了財產等東西的 '=' 號之前。

這是我的原始正則表達式,它確實捕獲了值。

(?< = [\ W] =)。*?[^,] +

,這是上述的變型,IMO什麼,我相信你會需要在Python

/(?<=[\w]=).*?[^,]+/g 
使用