我有正则表达式来解析许多值,例如a=b c=d e=f
,这应该导致像这样的字典:{'a': 'b', 'c':'d', 'e':'f'}
。我希望用户允许使用\
转义值,因此我使用((?:[^\\\s=]+|\\.)+)
加上(?:^|\s)
加上(?=\s|$)
和>>> import re
>>> reg = re.compile(r'(?:^|\s)([\w\d]+)=((?:[^\\\s=]+|\\.)+)(?=\s|$)')
>>> s = r'a=b c=d e=one\two\three'
>>> reg.findall(s)
[('a', 'b'), ('c', 'd'), ('e', 'one\\two\\three')]
,而不是真正简单的正则表达式,因此表达式不匹配部分结果。
=
然后有人出现并将>>> s = r'a=b c=d e=aaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbb\cccc
ccccc=dddddddddddddddd\eeeeeeeeeeeeeee'
>>> reg.findall(s)
插入到物品的右侧。
findall()
脚本被困在这条线上(我已经等了几个小时但没完成)。
问题:这是一个糟糕的正则表达式(为什么?你会怎么写呢?)或者是regexp实现错误吗?
注意:我不是要求解决这个问题,我很好奇为什么 {{1}}几小时内没有完成。
答案 0 :(得分:1)
你的问题是你重复嵌套,重新引擎似乎尝试了所有可能的分布:
r'(?:^|\s)([\w\d]+)=((?:[^\\\s=]+|\\.)+)(?=\s|$)'
^ ^
更好:
r'(?:^|\s)([\w\d]+)=((?:[^\\\s=]|\\.)+)(?=\s|$)'
事实上,findall会完成(或耗尽内存)。您可以尝试使用
s = r'a=b c=d e=aaaaaaa\bbbbbbbb\ccccccccc=ddddddddd\eeeee'
然后在“e=
”之后连续添加字符
答案 1 :(得分:0)
除非常简单的情况,正则表达式不适合您的任务。您需要对输入字符串进行标记。
在简单的情况下,您可以使用str.split()
:
for tok in s.split(" "):
tok = tok.split("=", 1)
key = tok[0]
value = tok[1]
我在相当长的一段时间内没有写过python,所以我不确定for … in …
语句是否正确,但你明白我的意思。
答案 2 :(得分:0)
>>> import re
>>> reg = re.compile(r'(\w+)=(\S+)')
>>> dict(reg.findall(r'a=b c=d e=one\two\three'))
{'e': 'one\\two\\three', 'a': 'b', 'c': 'd'}
>>> dict(reg.findall(r'a=b c=d e=aaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbb\ccccccccc=dddddddddddddddd\eeeeeeeeeeeeeee'))
{'e': 'aaaaaaaaaaaaaaaaaaaaaaaaaa\\bbbbbbbbbbbbbbbbbbbbbbbbbbbb\\ccccccccc=dddddddddddddddd\\eeeeeeeeeeeeeee', 'a': 'b', 'c': 'd'}