“破碎”的正则表达式?

时间:2013-06-12 08:25:37

标签: python regex python-3.2

我有正则表达式来解析许多值,例如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}}几小时内没有完成。

3 个答案:

答案 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'}