以不同的顺序检索多个捕获组?

2024-05-12 18:58:24 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们来看看这段文字:

2343 abcd
ajek 4827
1231 skj0

这个正则表达式:

/(?:(?P<number>\d{4})\s+(?P<text>\w{4})|(?P<text>\w{4})\s+(?P<number>\d{4}))/Jg

演示:https://regex101.com/r/yN9zK4/1

目标是检索:

{{ number: 2343, text: abcd },
 { number: 4827, text: ajek },
 { number: 1231, text: skj0 }}

有了,我就可以顺利地完成正则表达式的工作。你知道吗

Python似乎没有提供J选项。如何使用除正则表达式以外的其他机制使它与Python一起工作?你知道吗


Tags: texthttpscomnumber目标选项perl文字
2条回答

只通过分裂。这将产生一个字典列表。你知道吗

import re
from collections import OrderedDict

with open(r'file') as f:
    h = OrderedDict()
    l = []
    for line in f:
        d = {}
        f = line.split()
        for i in f:
            if i.isdigit() and len(i) == 4:
                d['number'] = i
            else:
                d['text'] = i
        l.append(d)

    print(l)    

在您的问题中,您编写输出结构{a:1},{b:2},{c:3}。这种结构是不可能的,因为不能在python中创建一组字典。集合只能包含未更改的对象,如数字、字符串或元组。你知道吗

您可以使用列表理解和简单的方法和函数将此文本解析为字典结构:

>>> multiline = '''2343 abcd
... ajek 4827
... 1231 skj0'''
... 
>>> [{'number':y[0],'text':y[1]} for y in (sorted(x.split()) for x in multiline.split('\n'))]
[{'text': 'abcd', 'number': '2343'}, {'text': 'ajek', 'number': '4827'}, {'text': 'skj0', 'number': '1231'}]
>>> 

或者使用线性字典生成器,如下所示:

>>> {int(k):v for k,v in [sorted(x.split()) for x in multiline.split('\n')]}
{4827: 'ajek', 1231: 'skj0', 2343: 'abcd'}

相关问题 更多 >