【问题标题】:Python Regex greedy boundariesPython 正则表达式贪婪边界
【发布时间】: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+ 基本上强制= 之前的内容不包含空格,所以你只得到变量名。

标签: python regex


【解决方案1】:

请注意,\s 也将匹配换行符,.+ 将匹配任何字符,包括空格。

我建议你在=之前使用[^\s=]+

exp = re.compile(r"([^\s=]+)=(.+?);")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多