Python &引用;“破碎的”;正则表达式?
我有一个正则表达式来解析许多值,比如Python &引用;“破碎的”;正则表达式?,python,regex,python-3.2,Python,Regex,Python 3.2,我有一个正则表达式来解析许多值,比如a=bc=def,这应该会导致这样的字典:{'a':'b','c':'d','e':'f'}。我希望用户允许使用\转义值,所以我使用了((?:[^\\\s=]+\\\)+)而不是真正简单的regexp,另外我还添加了(?:^\\\s)和(?=\s\$),这样表达式就不会匹配部分结果 >>> import re >>> reg = re.compile(r'(?:^|\s)([\w\d]+)=((?:[^\\\s=]+|\\.
a=bc=def
,这应该会导致这样的字典:{'a':'b','c':'d','e':'f'}
。我希望用户允许使用\
转义值,所以我使用了((?:[^\\\s=]+\\\)+)
而不是真正简单的regexp,另外我还添加了(?:^\\\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()不能在几个小时内完成。除了非常简单的情况外,正则表达式不是完成任务的合适工具。您需要标记输入字符串 在简单的情况下,您可以使用
str.split()
:
我已经有很长一段时间没有编写python了,所以我不确定,
for…in…
语句是否正确,但您明白我的意思。您的问题是嵌套重复,并且re引擎似乎尝试了其中所有可能的分布:
>>> 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'}
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=
”之后连续添加字符,为什么不允许在=
的右侧添加=
,而分隔符是空格字符?@DavidFoerster这是一个错误(已修复)。我很感兴趣的是为什么findall
永远不会结束。真正的问题是“你为什么有这么糟糕的格式”?使用JSON、YAML、换行分隔键=值对等等@kirelagin第三方应用程序。对此无能为力。在这种情况下,您不使用regexp完全正确,但您的解决方案没有转义。不,可能存在\
(转义空间),因此我不能使用标记化。或者至少不是这个简单的实现。我知道,我的示例不允许转义,因此“在简单的情况下”。这只是为了说明我的想法。我希望regexp能够处理这样的情况。@Vyktor比你应该读一本叫做“掌握正则表达式”的书要好得多。“太棒了!”维克托读了一遍
s = r'a=b c=d e=aaaaaaa\bbbbbbbb\ccccccccc=ddddddddd\eeeee'