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

2024-03-29 11:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一根线:

<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(...)中。我的正则表达式或方法是否有问题,应该如何修复?你知道吗

要清楚的是,我正在使用regex为一种高尔夫语言构建一个lexer,所以用char-by-char lexer之类的东西来替换它会很不方便,因为我已经设置了正则表达式lexer和大多数表达式。我想知道纯正则表达式的解决方案是否可行。你知道吗


Tags: 字符串文本importrehello列表world数量
1条回答
网友
1楼 · 发布于 2024-03-29 11:44:47

你可以试试这个:

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

输出:

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

相关问题 更多 >