正则表达式中的贪婪匹配与负向前瞻
我有一个正则表达式,想要提取出所有不紧跟着“(”符号的字母组合。举个例子,这个正则表达式是用在一个数学公式上,公式里有变量名(比如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 个回答
1
另一种方法是:找出那些后面跟着字符串结束或者非字母、非括号字符的字母串;然后提取出字母部分。
re.findall("([a-zA-Z]+)(?:[^a-zA-Z(]|$)", "movav(x/2, 2)*movsum(y, 3)*z")
3
添加一个单词边界匹配器 \b
:
>>> re.findall(r'[a-zA-Z]+\b(?!\()', "movav(x/2, 2)*movsum(y, 3)*z")
['x', 'y', 'z']
\b
用来匹配两个单词之间的空字符串,也就是说,它可以帮助你找到一个字母后面跟着一个单词的边界,并且这个边界后面不能紧接着 (
。想了解更多细节,可以查看 这个 re
的文档。
3
另一种不依赖于单词边界的解决方案:
检查字母后面是不是跟着一个 (
或者另一个字母。
>>> re.findall(r'[a-zA-Z]+(?![a-zA-Z(])', "movav(x/2, 2)*movsum(y, 3)*z")
['x', 'y', 'z']