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

时间:2015-09-04 07:21:45

标签: python regex

我们有这样的文字:

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

DEMO:https://regex101.com/r/yN9zK4/1

目标是检索这个:

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

使用我没有问题让我的正则表达式工作。

似乎Python没有提供J选项。如何使用除正则表达式之外的其他机制使Python工作?

2 个答案:

答案 0 :(得分: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)    

答案 1 :(得分:1)

在您的问题中,您编写输出结构{{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'}