从字符串中获取特定信息

时间:2014-04-30 10:28:14

标签: python regex

我想在Python中使用RegEx从fstr获取name的值。我尝试如下,但找不到预期的结果。

任何帮助都将受到高度赞赏。

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever" #",Extra=whatever" this portion is optional
myobj = re.search( r'(.*?),Name(.*?),*(.*)', fstr, re.M|re.I)
print(myobj.group(2))

3 个答案:

答案 0 :(得分:2)

您可能不相信,但实际问题是,*,在您的正则表达式中。它使匹配,可选。因此,正则表达式中的第二个捕获组不匹配任何内容(.*?表示零到无限制匹配并且懒惰匹配)并且它检查下一个项,*,这也意味着匹配,零或更多次。所以它匹配零次,最后一个捕获组匹配字符串的其余部分。

如果您想修复RegEx,只需删除逗号之后的*,就像这样

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ

Online RegEx demo (with the mistake)

Online RegEx demo (after fixing it)

Regular expression visualization

Debuggex Demo

但正如other answer所示,您不必创建其他捕获组。

顺便说一下,我喜欢在特别需要的时候使用RegEx。在这种情况下,我会解决它,没有RegEx,就像这样

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever"
d = dict(item.split("=") for item in fstr.split(","))
# {'FCode': '1', 'Extra': 'whatever', 'Name': 'XYZ', 'MCode': '1'}

现在我掌握了所有信息,我可以像这样访问它们

print d["Name"]
# XYZ

简单,对吧? : - )

编辑:如果您想对100万条记录使用相同的正则表达式,我们可以通过预编译RegEx来略微提高性能,就像这样

import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)

答案 1 :(得分:0)

您可以按照以下方式执行此操作:

import re

fstr = "MCode=1,FCode=1,Name=XYZ,Extra=whatever"

myobj = re.search( r'Name=([^,]+)', fstr, re.M|re.I)

>>> print myobj.group(1)
XYZ

答案 2 :(得分:0)

试试吧

rule = re.compile(r"Name=(?P<Name>\w*),")
res = rule.search(fstr)
res.group("Name")