Python正则表达式中的%号单词边界

0 投票
1 回答
31 浏览
提问于 2025-04-13 15:09

我想要找到所有的 1%,并且要确保它是一个完整的词。用下面这段Python代码却没有找到任何结果。我想要找到前两个 1% 的完整词,但不想找到作为最后一个词的一部分的 0.1%。所以,确保是完整词这一点很重要。

matches = re.finditer(r'\b1%\b', '1% of 100 is not 1% of 10 its 0.1%', re.I)
for match in matches:
    print(match)

有什么好主意吗?

1 个回答

0

来自 python re 文档

注意,正式来说,\b 是用来表示一个 \w 字符和一个 \W 字符之间的边界(或者反过来),或者是 \w 字符和字符串的开头或结尾之间的边界。

要知道,数字属于 \w,而点(.)属于 \W,所以在 .1 中是有边界的。而 % 和空格都属于 \W,所以在 % 中是没有边界的。

你可以使用负向查找来排除前面带点的1,方法如下:

import re
matches = re.finditer(r'(?<![.])1%', '1% of 100 is not 1% of 10 its 0.1%', re.I)
for match in matches:
    print(match)

这会输出:

<re.Match object; span=(0, 2), match='1%'>
<re.Match object; span=(17, 19), match='1%'>

注意,我使用了 [.],因为这里需要的是字面上的点,而不是表示任何字符的点。

撰写回答