2013-07-30 83 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 
使用