如何使用python正则表达式将字符串转换为字典

2024-06-16 15:23:20 发布

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

字符串格式如下<000001|ABC=123|DEF=456|~GHI=TEST|JKL=O1234_ABC.pdf> 输出格式应类似于{'ABC': '123', 'DEF': '456', '~GHI': 'TEST', 'JKL': 'O1234_ABC.pdf'}

我写了:groups = re.findall(r'(\w+)=(.*?)', line),但是它没有得到最后一个元素


Tags: 字符串testre元素pdfdef格式line
2条回答

我知道,您明确要求通过regex提供解决方案,但请注意,在您的简单案例中没有必要使用regex

如果必须解析大量与示例类似的字符串,那么在避免regex和仅使用python内置的split()函数处理字符串方面可以获得更好的性能

import re
from timeit import timeit

# Your example string
s = r"<000001|ABC=123|DEF=456|~GHI=TEST|JKL=O1234_ABC.pdf>"

# Using regex
a = re.findall(r'([^<=|>]+)=([^<|>]+)', s)
print("regex:   ", dict(a))

# Using str.split()
b = map(lambda x: x.split('='), s.strip('<>').split('|')[1:])
print("split(): ", dict(b))

# Performance
t1 = timeit("re.findall(r'([^<=|>]+)=([^<|>]+)', s)", globals=globals(), number=1000000)
print("time for regex: {:3.2f} s".format(t1))

t2 = timeit("map(lambda x: x.split('='), s.strip('<>').split('|')[1:])", globals=globals(), number=1000000)
print("time for str.split(): {:3.2f} s".format(t2))

结果:

regex:    {'ABC': '123', 'DEF': '456', '~GHI': 'TEST', 'JKL': 'O1234_ABC.pdf'}
split():  {'ABC': '123', 'DEF': '456', '~GHI': 'TEST', 'JKL': 'O1234_ABC.pdf'}
time for regex: 4.15 s
time for str.split(): 0.88 s

\w只匹配字母、数字和下划线,不匹配~.

您应该使用一种模式来匹配除分隔符以外的任何内容:<在开头,|在项目之间,=在名称和值之间,以及>在结尾

re.findall(r'([^<=|>]+)=([^<|>]+)', line)

相关问题 更多 >