Python正则表达式不返回所有组

时间:2017-09-28 00:26:14

标签: python regex

我有一个这样的字符串:

<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(...)中。我的正则表达式或方法有问题,我该如何解决?

要说清楚,我正在使用正则表达式为高尔夫语言构建词法分析器,所以用char-by-char词法分析器替换它会很不方便,因为我已经有了正则表达式词法分析器并且大多数表达式都设置了起来。我想知道纯正的正则表达式解决方案是否可行。

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

s = "<hello<world<1 \< 2>"
import re
l = [i for i in re.split("\<(?!\s\d)|\>", s) if i]

输出:

['hello', 'world', '1 \\< 2']