Skip to main content
 首页 » 编程设计

python之在python中使用正则表达式匹配可变数量的 token 出现

2024年08月15日33bjzhanghao

我尝试多次匹配一个标记,但我只取回最后一次匹配,据我所知这是正常行为 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