正则表达式中具有负前瞻的贪婪匹配

2024-09-27 00:11:54 发布

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

我有一个正则表达式,在这个正则表达式中,我试图提取每一组后面没有紧跟“(”符号)的字母。例如,以下正则表达式对包含变量名(x、y和z)和函数名(movav和movsum)的数学公式进行操作,这两个名称都完全由字母组成,但其中只有函数名后跟“(”。在

re.findall("[a-zA-Z]+(?!\()", "movav(x/2, 2)*movsum(y, 3)*z")

我希望表达式返回数组

^{pr2}$

但它返回数组

['mova', 'x', 'movsu', 'y', 'z']

从理论上我可以理解为什么正则表达式会返回第二个结果,但是有没有方法可以修改它以只返回数组['x', 'y', 'z']?在


Tags: 函数re名称表达式字母符号数组数学公式
3条回答

您需要将匹配限制为整个单词。所以使用\b来匹配单词的开头或结尾:

re.findall(r"\b[a-zA-Z]+\b(?!\()", "movav(x/2, 2)*movsum(y, 3)*z")

另一种不依赖单词边界的解决方案:

检查字母后面没有(或其他字母。在

>>> re.findall(r'[a-zA-Z]+(?![a-zA-Z(])', "movav(x/2, 2)*movsum(y, 3)*z")
['x', 'y', 'z']

添加字边界匹配器\b

>>> re.findall(r'[a-zA-Z]+\b(?!\()', "movav(x/2, 2)*movsum(y, 3)*z")
['x', 'y', 'z']

\b匹配两个单词之间的空字符串,因此现在您要查找后面紧跟着(的单词边界的字母。有关详细信息,请参见the ^{} docs。在

相关问题 更多 >

    热门问题