【发布时间】:2015-06-18 12:20:20
【问题描述】:
我有一个
import re
s = """
/* comments */
vector<CWaypoint> Vparam; // comment
int cValue=2049; // comment
double param=0.01; // comment
"""
exp = re.compile(r"(?:\s|\b)(.+?)=(.+?)\b;")
print(exp.findall(s))
我的预期输出是
[(cValue,2049), (param,0.01)]
但是为什么我在变量名之前得到数据类型,如下所示
[('int cValue', '2049'), ('double param', '0.01')]
为什么边界即使不贪婪也不起作用
【问题讨论】:
-
正则表达式从左到右扫描,因此它们匹配。您可以将您的正则表达式从
(.+?)=更改为(\w+)=以获得您想要的。 (虽然我不认为用正则表达式解析代码是个好主意)。 -
如果变量名中有特殊字符怎么办?
-
可以选择使用
(\S+),它匹配非空格字符(同样,这是非常差的近似值,您应该查阅文档以获取确切的字符集)。 -
什么是“从左到右”?我的意思是
.有什么不同? -
正则表达式引擎从左到右扫描,所以它会首先找到最左边的匹配,并且由于
\b.+?=.+?\b;匹配int cValue=2049,所以它作为匹配返回。\S+或\w+基本上强制=之前的内容不包含空格,所以你只得到变量名。