所以我有一个我无法弄清楚的快速问题。
我想要解析一些行,例如:
a = a/2;
b*= a/4*2;
float c += 4*2*sin(2);
我想要的是获得赋值的指定变量名称。因此,在这种情况下,我想要检索a
,b
,c
。
我有以下正则表达式:
match = re.search(r'\b(?:float)?(.*)(?:(\+|-|\*|\\)? =)',line)
当我打印m.group(1)
时,它会返回a
,b *
,c +
。
我无法弄清楚为什么它会在=
之前捕获操作符,有人可以解释一下吗?
答案 0 :(得分:2)
您使用(.*)
进行了前面的贪婪捕获,并且您允许操作员捕获是可选的(结尾为?
);有了这个,贪婪捕获就会引入操作员,而不是让它落到与=
匹配的组中。
尝试将贪婪捕获更改为仅可接受的内容。从它的外观来看,它只能是字母数字值和空格(数字是一个猜测,所以如果不需要可以删除):
\b(?:float\s+)?([a-zA-Z0-9]+)\s*(?:(\+|-|\*|\\)? =)
答案 1 :(得分:0)
我认为它可以是一个更简单的正则表达式。
首先,你的变量只能是字母数字,我还没有看到任何其他类似的变量。
所以你的捕获组已经是这样了:(\w+)
然后,如果之前唯一能够浮动的东西,它应该看起来像\b(?:float\s+)?
但实际上,这就是我们所需要的。
唯一缺少的是在尝试一次读取所有内容的情况下读到行尾,否则如果你按原样阅读每一行则不需要它:.*\n
所以你的整个事情可能是:\b(?:float\s+)?(\w+).*\n
一旦正则表达式达到非字母数字,例如空格,'='符号或任何其他符号,它将不再是捕获组的一部分。
:)
运行我在你的例子中提到的正则表达式:
>>> import re
>>> re.findall(r'\b(?:float\s+)?(\w+).*\n', "a = a/2;\nb*= a/4*2;\nfloat c += 4*2*sin(2);\n")
['a', 'b', 'c']
并一次运行每一行:(^
告诉正则表达式从字符串的开头开始。)
>>> re.findall(r'^(?:float\s+)?(\w+)', "a = a/2")
['a']
>>> re.findall(r'^(?:float\s+)?(\w+)', "b*= a/4*2")
['b']
>>> re.findall(r'^(?:float\s+)?(\w+)', "float c += 4*2*sin(2)")
['c']