Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;“破碎的”;正则表达式?_Python_Regex_Python 3.2 - Fatal编程技术网

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'