3

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

我有一些要解析的行,例如:

  • 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 +.

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

4

2 回答 2

2

您有一个前面的贪婪捕获,(.*)并且您允许您的 operator-capture 是可选的(带有结尾?);有了这个,贪婪捕获就是引入操作员而不是让它通过匹配的组=

尝试将贪婪捕获更改为那里可以接受的内容。从外观上看,它只能是字母数字值和空格(数字是猜测,因此如果不需要,可以将其删除):

\b(?:float\s+)?([a-zA-Z0-9]+)\s*(?:(\+|-|\*|\\)? =)
于 2012-10-02T15:17:18.327 回答
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']
于 2012-10-02T15:44:48.010 回答