我有一个正则表达式,其中我试图提取不紧跟“(”符号)的每组字母。例如,以下正则表达式对包含变量名称的数学公式进行操作(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']
?
答案 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")