我尝试多次匹配一个标记,但我只取回最后一次匹配,据我所知这是正常行为 this answer ,但我无法获得示例中提供的解决方案。
我的文字看起来像这样:
&{dict1_name}= key1=key1value key2=key2value
&{dict2_name}= key1=key1value
所以基本上是多行,每行都有一个起始字符串、空格,然后是可变数量的 key 对。如果您想知道这是从哪里来的,它是一个机器人框架变量文件,我正在尝试将其转换为 Python 变量文件。
我将逐行迭代以匹配 key 对并从中构建一个 python 字典。
我当前的正则表达式模式是:
&{([^ ]+)}=[ ]{2,}(?:[ ]{2,}([^\s=]+)=([^\s=]+))+
这正确地得到了字典名称,但 key 对只匹配最后一次出现,如上所述。我怎样才能让它返回一个元组包含: ("dict1_name","key1","key1value"..."keyn","keynvalue") 这样我就可以迭代这个像这样构造 python 字典:
dict1_name= {"key1": "key1value",..."keyn": "keynvalue"}
谢谢!
请您参考如下方法:
正如您所指出的,您需要解决捕获组只会捕获最后一场比赛的事实。一种方法是利用文件中的行是可迭代的这一事实,并使用两种模式:一种用于“行名”,一种用于其多个键值对:*
import re
dname = re.compile(r'^&{(?P<name>\w+)}=')
keyval = re.compile(r'(?P<key>\w+)=(?P<val>\w+)')
data = {}
with open('input/keyvals.txt') as f:
for line in f:
name = dname.search(line)
if name:
name = name.group('name')
data[name] = dict(keyval.findall(line))
*不可否认,这有点低效,因为您每行要进行两次搜索。但是对于中等大小的文件,你应该没问题。
结果:
>>> from pprint import pprint
>>> pprint(data)
{'d5': {'key1': '28f_s', 'key2': 'key2value'},
'name1': {'key1': '5', 'key2': 'x'},
'othername2': {'key1': 'key1value', 'key2': '7'}}
注意 \w 匹配 Unicode 单词字符。
示例输入,keyvals.txt:
&{name1}= key1=5 key2=x
&{othername2}= key1=key1value key2=7
&{d5}= key1=28f_s key2=aaa key2=key2value
