Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式-将多个表达式与组匹配_Python_Regex - Fatal编程技术网

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