繁体   English   中英

从字符串中获取特定信息

[英]Get particular information from a string

我想在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))

您可能不相信,但实际问题是正则表达式中的,* 它使匹配,可选的。 因此,正则表达式中的第二个捕获组不匹配任何内容( .*?表示零到无限制之间的匹配,并且延迟进行匹配),并检查下一个项目,* ,也表示match ,零次或多次。 因此它匹配零次,最后捕获组匹配字符串的其余部分。

如果要修复RegEx,只需在逗号后删除* ,就像这样

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

在线RegEx演示(错误)

在线RegEx演示(修复后)

正则表达式可视化

Debuggex演示

但是,正如其他答案所示,您不必创建其他捕获组。

顺便说一句,我喜欢仅在特别需要时才使用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

简单吧? :-)

编辑:如果要对一百万条记录使用相同的正则表达式,则可以通过预编译RegEx来稍微提高性能,如下所示

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

您可以按照以下步骤进行操作:

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

试试吧

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

暂无
暂无

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

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