0

我有一个字符串:

property1=1234, property2=102.201.333, property3=abc

我想捕获 1234 和 102.201.333。我正在尝试使用正则表达式:

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

但它只设法捕获其中一个值。基于此链接,我还尝试了:

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

他们从我无法想象的地方捕获了一个额外的群体。

我错过了什么?

PS 我正在使用 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
4

6 回答 6

1

正则表达式非常适合那些表现得像lexemes的东西,但不适合通用解析。

但是,在这种情况下,您的“配置-y 字符串”可能仅由以下形式的词位序列组成:word = value[ , word = value... ]。如果是这样,您可以使用正则表达式和重复。但是,正确的正则表达式取决于wordand的确切形式value(在较小程度上,您是否要检查错误)。例如,是:

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."

假设禁止使用空格,并且wordandvalue部分只是“与“匹配的字母数字\w”:

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

不过,从这个102.201.333值显然\w不足以value匹配比赛。如果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

美元符号(不是字母数字字符)将被忽略,for 的值b因空格而被忽略,for 值后面的两个逗号c也被忽略。

于 2013-07-30T03:02:40.533 回答
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'
于 2013-07-30T01:25:46.000 回答
0

您正在使用|. 这意味着您的正则表达式将匹配栏左侧的内容或右侧的内容。

于 2013-07-30T01:20:19.620 回答
0

你可以试试:

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

这将匹配等号之后和空格之前的任何属性。property_value就像文档说的那样,可以从名称中访问它:

从python re 文档复制

例如,如果模式是 (?P[a-zA-Z_]\w*),则可以在匹配对象方法的参数中通过其名称引用组,例如 m.group('id') 或 m .end('id'),以及正则表达式本身中的名称(使用 (?P=id))和给 .sub() 的替换文本(使用 \g)。

于 2013-07-30T01:21:30.177 回答
0

尝试这个:

property_regex = re.compile('property[0-9]+=([^\s]+)')
于 2013-07-30T01:25:11.483 回答
0

我已经尝试为您构建一个正则表达式,它将为您提供 property1= 和 property2 之后的值,但我不确定您如何在 Python 中使用它们。

编辑

现在在“=”符号之前捕获除属性之外的其他内容。

这是我的原始正则表达式,它确实捕获了该值。

(?<=[\w]=).*?[^,]+

这是上述的变体,IMO 我相信你需要在 Python 中使用

/(?<=[\w]=).*?[^,]+/g
于 2013-07-30T01:58:59.233 回答