regex 关于正则表达式单词边界

bnlyeluc  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(162)

我有这样的字符串:

s='''
D. JUAN:
¡Cálmate, pues, vida mía!
Reposa aquí; y un momento
olvida de tu convento
la triste cárcel sombría.
¡Ah! ¿No es cierto,
ángel de amor,
que en esta apartada orilla
más pura la luna brilla
y se respira mejor?
'''

如果我希望所有单词都以元音开头:

import re
print(re.findall(r'\b[aeiouAEIOU]\w*\b', s))

输出为:['aquí','un','olvida','ah','es','amor','en','esta','apartada','orilla']
现在,我试着列出所有不以元音开头的单词:print(re.findall(r'\b[^aeiouAEIOU]\w*\b', s))
我的输出是:

['D', 'JUAN', 'Cálmate', 'pues', 'vida', ' mía', 'Reposa', ' aquí', 'y', ' un', ' momento', '\nolvida', ' de', ' tu', ' convento', '\nla', ' triste', ' cárcel', ' sombría', 'No', ' es', ' cierto', 'ángel', ' de', ' amor', 'que', ' en', ' esta', ' apartada', ' orilla', '\nmás', ' pura', ' la', ' luna', ' brilla', '\ny', ' se', ' respira', ' mejor']

我的问题是为什么它不起作用?

csbfibhn

csbfibhn1#

[^aeiouAEIOU]求反字符类匹配除aeiouAEIOU之外的 * 任何 * 字符,因此换行符或者如果§前面有单词字符(在大多数情况下是字母、数字或下划线),则也将匹配§,因为求反的字符类前面有\b构造。
所以你需要用

re.findall(r'\b(?![aeiouAEIOU])\w+', s)

其中(?![aeiouAEIOU])负前视将确保\w+仅匹配其中第一个字符不等于字符类内的字母的一个或多个单词字符。
参见regex demo(注意,必须在regex101选项中选择正确的引擎)。
注意,在\w+之后的末尾不需要任何\b,因为字边界隐含在该位置。

相关问题