我们有这样的文字:
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工作?
答案 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'}