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

and*_*ndy 1 python regex

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

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

困扰我的是什么\/意思([\w\/%]*)

Tim*_*ker 7

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

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

更令人担忧的是作者未能使用原始字符串.在许多情况下,这并不重要(因为Python将把"\d""\\d",然后正确地转换到正则表达式\d,但在其他情况下,就会造成问题.其中一个例子是"\b",这意味着"退格字符",而不是"一个字边界锚 "像正则表达式\b一样.

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

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

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