如何使用长正则表达式进行行延续? [复制]

Posted

技术标签:

【中文标题】如何使用长正则表达式进行行延续? [复制]【英文标题】:How do I do line continuation with a long regex? [duplicate] 【发布时间】:2016-01-17 14:56:08 【问题描述】:

我有一个很长的正则表达式,我想继续到下一行,但我尝试过的所有操作都会给我一个 EOL 或破坏正则表达式。我已经在括号内续写了一次,并阅读了How can I do a line break (line continuation)? 等内容。

工作,但仍然太长:

REGEX = re.compile(
            r'\d\s+\d+\s+([A-Z0-9-]+)\s+([0-9]+.\d\(\d\)[A-Z0-9]+)\s+([a-zA-Z\d-]+)')

错误:

REGEX = re.compile(
            r'\d\s+\d+\s+([A-Z0-9-]+)\s+([0-9]+.\d\(\d\)[A-Z0-9]+
            )\s+([a-zA-Z\d-]+)')

SyntaxError: EOL while scanning string literal


REGEX = re.compile(
            r'\d\s+\d+\s+([A-Z0-9-]+)\s+([0-9]+.\d\(\d\
                )[A-Z0-9]+)\s+([a-zA-Z\d-]+)')
    
sre_constants.error: unbalanced parenthesis


REGEX = re.compile(
            r'\d\s+\d+\s+([A-Z0-9-]+)\s+( \
            [0-9]+.\d\(\d\)[A-Z0-9]+)\s+([a-zA-Z\d-]+)')

regex no longer works


REGEX = (re.compile(
            r'\d\s+\d+\s+([A-Z0-9-]+)\s+(
            [0-9]+.\d\(\d\)[A-Z0-9]+)\s+([a-zA-Z\d-]+)'))

SyntaxError: EOL while scanning string literal

我已经能够缩短我的正则表达式,因此这不再是一个问题,但我现在很想知道如何使用长正则表达式进行行延续?

【问题讨论】:

docs.python.org/2/library/re.html?highlight=verbose#re.VERBOSE 您的搜索查询的问题在于您认为这是继续一行,而您找到的答案是关于“继续一个逻辑行”,这是不是你需要的。获得所需答案的术语是“继续多行 string。” 我想我认为正则表达式与常规 Python 字符串不同。尽管 re.VERBOSE 答案是特定于正则表达式的,而不是使正则表达式成为多行字符串。 正则表达式和您通常使用的字符串之间的唯一区别是r 表示原始字符串。它只是为了方便。您可以将r 与不用作正则表达式的字符串一起使用(例如r'C:\Users'),并且您可以在没有r 的情况下创建正则表达式字符串(例如'[0-9]3-[0-9]3-[0-9]4')。 【参考方案1】:

尝试:

regex = re.compile(
    r'\d\s+\d+\s+([A-Z0-9-]+)\s+('
    r'[0-9]+.\d\(\d\)[A-Z0-9]+)\s+([a-zA-Z\d-]+)'
)

【讨论】:

【参考方案2】:

您可以在多行中使用多个字符串,Python 会在发送到re.compile 之前将它们连接起来(只要多个字符串在() 之间)。示例 -

REGEX = re.compile(r"\d\s+\d+\s+([A-Z0-9-]+)\s+([0-9]+.\d\(\d\)"
                   r"[A-Z0-9]+)\s+([a-zA-Z\d-]+)")

【讨论】:

【参考方案3】:

如果您使用re.VERBOSE 标志,您可以根据需要拆分正则表达式以使其更具可读性:

pattern = r"""
    \d\s+
    \d+\s+
    ([A-Z0-9-]+)\s+
    ([0-9]+.\d\(\d\)[A-Z0-9]+)\s+
    ([a-zA-Z\d-]+)"""

REGEX = re.compile(pattern, re.VERBOSE)

优秀的“Dive Into Python”一书中解释了这种方法。 请参阅“详细正则表达式”。

【讨论】:

我喜欢这样将其保留在正则表达式中,而不是使用连接。

以上是关于如何使用长正则表达式进行行延续? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在正则表达式值或值内添加注释? [复制]

如何使用正则表达式仅捕获具有特定格式的有效句子的第一个单词? [复制]

如何删除所有行包括Notepad ++中的正则表达式的'collect_host_stats'[复制]

如何在 C++ 中对多个正则表达式使用正则表达式“分组”?

如何编写正则表达式来查找/替换 HTML 类? [复制]

打字稿:如何在 2 行中编写长正则表达式 [重复]