繁体   English   中英

Python Regex - 将多个表达式与组匹配

[英]Python Regex - Match multiple expression with groups

我有一个字符串:

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

作为替代方案,我们可以使用一些字符串拆分来创建字典。

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

正则表达式对于像lexemes这样的东西很有用,对于通用解析不太好。

但是,在这种情况下,看起来你的“configuration-y string” 可能只包含一系列形式的词汇: word = value [ , word = value ...]。 如果是这样,您可以使用正则表达式和重复。 正确的正则表达式取决于单词的确切形式(但在较小程度上,取决于您是否要检查错误)。 例如,是:

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

允许还是不允许? 如果是这样, this是设置为a string with spaces (没有引号) "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值后面的两个逗号。

你正在使用| 这意味着你的正则表达式将匹配条形图左侧的东西或右侧的东西。

你可以尝试:

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)。

尝试这个:

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

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

编辑

现在在'='符号之前捕获除属性之外的其他东西。

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

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

这是以上的变种,IMO我认为你需要在Python中使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM