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

时间:2011-11-03 17:49:21

标签: python

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

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

我希望表达式返回数组

['x', 'y', 'z']

但它返回数组

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

我可以在理论上看到为什么正则表达式将返回第二个结果,但有没有办法可以修改它以返回数组['x', 'y', 'z']

4 个答案:

答案 0 :(得分:3)

添加字边界匹配器\b

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

\b匹配两个单词之间的空字符串,所以现在您正在查找字母后面跟着(后面没有紧跟的单词边界。有关详细信息,请参阅the re docs

答案 1 :(得分:3)

另一种不依赖于字边界的解决方案:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

另一种方法:找到字母串,后跟字符串结尾或非字母,非括号字符;然后抓住字母部分。

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