Python正则表达式-将多个表达式与组匹配
我有一个字符串:Python正则表达式-将多个表达式与组匹配,python,regex,Python,Regex,我有一个字符串: property1=1234, property2=102.201.333, property3=abc 我想捕捉1234和102.201.333。我正在尝试使用regex: property1=([^,]*)|property2=([^,]*) 但它只能捕获其中一个值。基于此,我还尝试: ((?:property1=([^,]*)|property2=([^,])+) (?:(property1=([^,]*)|property2=([^,])+) 他们从我想不出来的地
property1=1234, property2=102.201.333, property3=abc
我想捕捉1234和102.201.333。我正在尝试使用regex:
property1=([^,]*)|property2=([^,]*)
但它只能捕获其中一个值。基于此,我还尝试:
((?:property1=([^,]*)|property2=([^,])+)
(?:(property1=([^,]*)|property2=([^,])+)
他们从我想不出来的地方抓到了一个额外的团体
我错过了什么
另外,我正在使用re.search()
编辑:我的呼叫代码可能有问题:
m = re.search('property1=([^,]*)|property2=([^,]*)', text);
print m.groups()
编辑2:它不一定是propertyX。它可以是任何东西:
foo1=123, bar=101.2.3, foobar=abc
甚至
您使用的是
|
。这意味着您的正则表达式将匹配条左侧的内容或右侧的内容。您可以尝试:
property_regex = re.compile('property[0-9]+=(?P<property_value>[^\s]+)')
property\u regex=re.compile('property[0-9]+=(?P[^\s]+))
它将匹配等号之后和空格之前的任何属性。它可以从名称属性\u值
访问,就像文档中所说的:
抄袭
例如,如果模式是(?p[a-zA-Z_uw*),则组可以是
在匹配对象的方法的参数中由其名称引用,例如
以m.group('id')或m.end('id')的形式出现,也可以按常规格式中的名称出现
表达式本身(使用(?P=id))和指定给.sub()的替换文本
(使用\g)
试试这个:
property_regex = re.compile('property[0-9]+=([^\s]+)')
作为替代,我们可以使用一些字符串拆分来创建字典
text = "property1=1234, property2=102.201.333, property3=abc"
data = dict(p.split('=') for p in text.split(', '))
print data["property2"] # '102.201.333'
我已经尝试过为您构建一个正则表达式,它将为您提供property1=和property2之后的值,但我不确定您在Python中如何使用它们 编辑 现在捕获除“=”符号前的属性之外的其他内容 这是我的原始正则表达式,它确实捕获了值
(?正则表达式适用于类似的情况,但不适用于一般用途的解析 不过,在这种情况下,您的“配置-y字符串”可能仅由以下形式的词素序列组成:word
=
value[,
word=
value…]。如果是这样,您可以使用regexp和重复。不过,正确的regexp取决于word和value的确切形式(以及在较小程度上,是否要检查错误)。例如:
this="a string with spaces", that = 42, quote mark = "
是否允许?如果允许,是否将此设置为带空格的字符串(无引号)或带空格的字符串(包括引号)?是否将设置为42
(有前导空格)或仅42
(无引号)?是否为引号(有嵌入空格)允许,是否设置为一个双引号?如果存在双引号,请使用“转义”逗号,以便您可以写入:
greeting="Hello, world."
假设禁止使用空格,并且单词和值部分仅为“字母数字匹配\w
”:
从102.201.333
值可以清楚地看出,\w
不足以匹配值。如果值为“所有内容都不是逗号”(包括空格),则:
越来越近。这些都会忽略“垃圾”并禁止=
符号周围的空格。如果字符串是“$a=this,b=that,c=102.201.333,,”
,则循环的第二个将打印:
a this
c 102.201.333
美元符号(不是字母数字字符)被忽略,b
的值由于空格而被忽略,c
的值后的两个逗号也被忽略。对不起,我在这里过于简化了。它不必是propertyX。它可以是foo1=123、bar=101.2.3、foobar=abcinterest的任何内容,可能会将此作为最后的手段。我的用例既简单又有趣比这更激烈的是:它更简单,因为:*属性1,属性2(即单词)是已知的和硬编码的*我可以忍受一些错误,这很困难,因为*值可能很复杂(weirdbar[345,weirderbar[123])我意识到我正在尝试更多的反序列化,而不是正则表达式解析。因此,我将完全转向另一种方法。但我会将您的解决方案标记为最完整的解决方案。
greeting="Hello, world."
for word, value in re.findall(r'([\w]+)=([\w]+)', string):
print word, value
for word, value in re.findall(r'([\w]+)=([^,]+)', string):
print word, value
a this
c 102.201.333