如何使regex匹配的一部分成为可选的?

2024-04-27 11:16:04 发布

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

这是一个示例字符串:

123456#p654321

目前,我使用此匹配将123456654321捕获到两个不同的组中:

([0-9].*)#p([0-9].*)

但有时,字符串的#p654321部分不在那里,所以我只想捕获第一个组。我试图通过在第二个组后面附加?使其成为“可选”组,这是有效的,但前提是在剩余字符串的末尾有一个#p

解决这个问题的最好办法是什么?


Tags: 字符串示例末尾办法前提p654321
2条回答

您拥有捕获组之外的#p,这使得它成为结果的必需部分。您还未正确使用点字符(.)。点(在大多数reg ex变体中)将匹配任何字符。更改为:

([0-9]*)(?:#p([0-9]*))?

(?:)语法是获取非捕获组的方式。然后我们只捕获你感兴趣的数字。最后,我们让整件事都是可选的。

而且,大多数reg-ex变体都有一个\d字符类。所以你可以进一步简化:

(\d*)(?:#p(\d*))?

正如另一个人指出的,*运算符可能与zero数字匹配。要防止这种情况,请改用+运算符:

(\d+)(?:#p(\d+))?

您的regex实际上将匹配no数字,因为您使用了*,而不是+
这就是(我想)你想要的:

(\d+)(?:#p(\d+))?

相关问题 更多 >