多行正则表达式

3 投票
1 回答
525 浏览
提问于 2025-04-17 12:54

我在用正则表达式搜索多行模式时遇到了一些问题。这是我用的一个多行字符串示例:

some command [first line]\n
second line \n
yes can have multiple lines\n
\n
something else that I do not care about.

这是我到目前为止尝试过的:

>>> match = re.match(r"^(.+)\n((.*\n)*)\n",body,re.MULTILINE)
>>> match.groups()
('some command [first line]', 'second line \nyes can have multiple lines\n', 'yes can have multiple lines\n')

我想找到 match.group(1) 和 match.group(2),这两个我都很满意,但让我困扰的是我还得到了 match.group(3),这是我不期望的(这让我觉得我的正则表达式可能有问题)。

另外,我似乎也没有正确使用命名模式……

 match = re.match(r"^(.+)\n((?P<bd>.*\n)*)\n",body,re.MULTILINE)
 >>> match.group(bd)
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 NameError: name 'bd' is not defined

我看过了 谷歌的Python正则表达式教程,但很明显我还没有完全理解。

1 个回答

4

我理解得对吗?你期望的结果是在组3,而不是组2吗?

如果这是你的问题,你可以通过在组的开头加上 ?: 来让组不被捕获,像这样:

re.match(r"^(.+)\n(?:(.*\n)*)\n",body,re.MULTILINE)

这样你就只会在结果中得到两个组。

也许我理解错了,你是想去掉组3,那样的话:

re.match(r"^(.+)\n((?:.*\n)*)\n",body,re.MULTILINE)

就是解决办法。

命名组

你可以这样访问你的命名组:

m.group('bd')

你需要给 group() 传入一个整数或字符串作为参数,具体可以查看 MatchObject 的文档。

撰写回答