Python正则表达式在某些情况下需要很长时间

Python正则表达式在某些情况下需要很长时间,python,regex,Python,Regex,我编译了以下模式 pattern = re.compile( r""" (?P<date>.*?) \s* (?P<thread_id>\w+) \s*PACKET\s* (?P<identifier>\w+) \s* (?P<proto>\w+) \s* (?P<indicator>\w+) \s* (?P<ip>\d+\.\d

我编译了以下模式

pattern = re.compile(
    r"""
    (?P<date>.*?)
    \s*
    (?P<thread_id>\w+)
    \s*PACKET\s*
    (?P<identifier>\w+)
    \s*
    (?P<proto>\w+)
    \s*
    (?P<indicator>\w+)
    \s*
    (?P<ip>\d+\.\d+\.\d+\.\d+)
    \s*
    (?P<xid>\w+)
    \s*
    (?P<q_r>.*?)
    \s*\[
    (?P<flag_hex>[0-9]*)
    \s*
    (?P<flag_char_code>.*?)
    \s*
    (?P<status>\w+)
    \]\s*
    (?P<record>\w+)
    \s*
    \.(?P<domain>.*)\.
    """, re.VERBOSE
    )

问题是,在某些情况下,需要花费很长时间,你知道如何增强消耗时间的模式。

是的,你有一个案例,也称为“邪恶正则表达式”,这里:

\s*
(?第页*)
\*
在这里:

\s*
(?第页*)
\*
在这里:

\s*
\.(?P<domain>.*)\.
\s*
\.(?P.*)\。
\S*
替换
*
应该可以解决这个问题

有关什么是邪恶正则表达式以及为什么它是邪恶的更多信息,请查看以下问题:

您可以通过以下方式改进您的模式:

(?P<domain>\w+(?:[-.]\w+)*)
(?P<date>\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M)
(?P<q_r>[^[]*)
(?P\w+(?:[-.]\w+*)
(?P\d{1,2}/\d{1,2}/\d{4}\d{1,2}:\d{1,2}:\d{1,2}[AP]M)
(?P[^[]*)

您还需要一个更明确的flag_char_代码子模式,目标是描述每个组的内容,以减少正则表达式引擎的工作量并避免回溯。

定义“long”?你能给我们举一个输入字符串的例子吗?正则表达式需要很长时间才能匹配?作为补充说明,我可能不会使用正则表达式来解决这个问题——它看起来像是一个很好的字符串对象的旧
split()
方法的用例。你使用的是哪种方法?如果你没有使用
re.match()
,我要做的第一件事是在开头添加一个
^
字符串/线锚的开头。另外,@JDB关于:
\s*(?*)的说法是正确的\s*
构造可能会跑掉。最好将所有可以拆分的内容拆分,然后在无法拆分的部分中搜索。这样逻辑就不那么复杂了。而且在许多情况下,它会运行得更快。非常感谢,这是我第一次听到regex中的回溯。
\s*
(?P<flag_char_code>.*?)
\s*
\s*
\.(?P<domain>.*)\.
(?P<domain>\w+(?:[-.]\w+)*)
(?P<date>\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{1,2}:\d{1,2} [AP]M)
(?P<q_r>[^[]*)