我想在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))
答案 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)
但正如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")