正则表达式捕获组

时间:2012-10-02 15:12:48

标签: python regex

所以我有一个我无法弄清楚的快速问题。

我想要解析一些行,例如:

  • a = a/2;
  • b*= a/4*2;
  • float c += 4*2*sin(2);

我想要的是获得赋值的指定变量名称。因此,在这种情况下,我想要检索abc

我有以下正则表达式:

match = re.search(r'\b(?:float)?(.*)(?:(\+|-|\*|\\)? =)',line)

当我打印m.group(1)时,它会返回ab *c +

我无法弄清楚为什么它会在=之前捕获操作符,有人可以解释一下吗?

2 个答案:

答案 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']