【发布时间】:2017-09-28 08:39:10
【问题描述】:
我有一个这样的字符串:
<hello<world<1 \< 2>,表示三个字符串"hello", "world", "1 < 2"的列表。我希望我的正则表达式能够匹配("hello", "world", "1 \< 2")。 (我将在稍后的评估中删除反斜杠)。我正在使用以下正则表达式来匹配文本:
r"(?:<((?:[^<>]|\\.)*))+>"
按照我的理解,它至少匹配一个(< 后面有任意数量的非<> 或\anything),然后是结束>,但结果并不表明。使用re.match(..., ...).groups(),我得到以下信息:
>>> import re
>>> re.match(r"(?:<((?:[^<>]|\\.)*))+>", r"<hello<world<1 \< 2>").groups()
<<< (' 2',)
>>> re.match(r"(?:<((?:[^<>]|\\.)*))+>", r"<hello<world<1 \< 2>").group(0)
<<< '<hello<world<1 \\< 2>'
令人困惑的是group(0) 甚至不在groups() 中,而且似乎其余的子字符串不在group(...) 中。我的正则表达式或方法有问题,我应该如何解决?
需要明确的是,我正在使用正则表达式为高尔夫语言构建词法分析器,因此将其替换为逐字符词法分析器会很不方便,因为我已经有了正则表达式词法分析器和大部分表达式集向上。我想知道是否可以使用纯正则表达式解决方案。
【问题讨论】:
-
用
<分割怎么样?re.split(r"(?<!\\)<", r"<hello<world<1 \< 2>") -
@Psidom 不适用于反斜杠
<... 虽然我可以尝试在它之前对非反斜杠使用非捕获匹配。我试试,谢谢! -
@Psidom 嘿,实际上效果很好。谢谢!您可以发布答案,以便我支持您的方法吗?
-
哪一个有效?如果您不想在
\<上拆分,我想普通拆分是行不通的。 -
@Psidom 我在比赛中设法做到了
re.split(r"(?=[^\\])<", text),但是你提供的那个对我的目的很有效;谢谢!