如何使用长正则表达式进行行延续? [复制]
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”一书中解释了这种方法。 请参阅“详细正则表达式”。
【讨论】:
我喜欢这样将其保留在正则表达式中,而不是使用连接。以上是关于如何使用长正则表达式进行行延续? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式仅捕获具有特定格式的有效句子的第一个单词? [复制]