这个python正则表达式意味着什么“([\ w \ /%] *)”

时间:2014-10-20 13:54:55

标签: python regex

我正在shinken / misc / perfdata.py中阅读Shinken源代码,我终于找到了一个我无法理解的正则表达式。像这样:

metric_pattern = re.compile('^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*);?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*')

让我感到困惑的是\/([\w\/%]*)的含义是什么?

1 个答案:

答案 0 :(得分:7)

你理所当然地混淆了,因为那个正则表达式一定是由一个不熟悉Python正则表达式的人编写的。

在某些语言(例如JavaScript)中,正则表达式由斜杠分隔。这意味着如果你的正则表达式需要一个实际的斜杠,你必须逃避它。由于Python不使用斜杠,因此无需转义斜杠(但也不会导致错误)。

更令人担忧的是作者未能使用原始字符串。在许多情况下,这无关紧要(因为Python会将"\d"视为"\\d"然后正确转换为正则表达式\d,但在其他情况下,它会导致问题。是"\b",这意味着“退格字符”,而不是像正则表达式\b那样的“word boundary anchor”。

此外,作者已经逃脱了许多根本不需要转义的角色。整个正则表达式可以重写为

metric_pattern = re.compile(r'^([^=]+)=([\d.+eE-]+)([\w/%]*);?([\d.+eE:~@-]+)?;?([\d.+eE:~@-]+)?;?([\d.+eE-]+)?;?([\d.+eE-]+)?;?\s*')

即便如此,我很惊讶它的功能完全正常。对我来说看起来很混乱,绝对不是万无一失的。例如,catastrophic backtracking似乎有很大的潜力,这意味着用户可能会使用恶意输入冻结您的服务器。