Python 从字符串中获取特定信息

Python 从字符串中获取特定信息,python,regex,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)) 您可以按如下方式进行操作:

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

您可以按如下方式进行操作:

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

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

如果要修复正则表达式,只需删除逗号后的
*
,如下所示

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ
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
import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)

但是如图所示,您不必创建额外的捕获组

顺便说一句,我喜欢只在特别需要的时候使用正则表达式。在这种情况下,如果没有正则表达式,我会像这样解决它

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ
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
import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)
现在我有了所有的信息,我可以像这样访问它们

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ
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
import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)
简单,是吗?:-)

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

myobj = re.search( r'(.*?),Name(.*?),(.*)', fstr, re.I)
print(myobj.group(2))
# =XYZ
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
import re
pattern = re.compile(r"Name=([^,]+)", re.I)
match = re.search(pattern, data)
if match:
    match.group(1)
试试看

rule=re.compile(r“Name=(?P\w*),”)
res=规则搜索(fstr)
资源组(“名称”)

@AbdullahFahim检查一下我在回答中提到的另一种方法,你会喜欢(祈祷):-)整洁:。。。顺便说一句,你认为哪一个更快?因为在这种方法中,涉及到两个拆分。。(速度对我来说是最重要的,因为我的代码太长了)@AbdullahFahim如果你想访问所有的值,那么最好创建一个类似于记录的字典,你可以随时获取这些值。如果是一次性的,那么你可以根据自己的舒适程度选择其中一种。。我学到的新东西。。。顺便说一句,我只需要那个名字的部分,其他的都没用。。但我必须在每小时内获得数百万条记录的“名称”信息…@AbdullahFahim请检查更新的答案,我刚刚给出了一个建议,如果您使用正则表达式方法处理数百万条记录,可以稍微提高性能。