-
这里详细介绍一下有关正则表达式中转义字符\的用法,因为感觉网上都是一笔带过,没有深入去讲解,平时遇到反斜杠的时候总是很懵,这里介绍一下我自己的想法:
注意以下想法只针对python中的re模块,其他语言中的正则表达式我没试过
我们用re.match函数来讲解,首先看下面一个例子:
import re temp = "(12, 23)" matches = re.match("\((\d+), (\d+)\)", temp) print(matches.group()) # (12, 23) matches = re.match(r"\((\d+), (\d+)\)", temp) print(matches.group()) # (12, 23)
看完代码发现,为啥加了r和不加r对结果都没有任何影响呢?不是说r里面都应该变成原生字符串吗,那应该加了r就匹配不上了呀,怎么还能匹配上?
针对上面的问题,我通过尝试很多例子总结出原因:
re模块匹配正则其实分为两个步骤:
1. 输入时转义
2. 匹配时转义输入时转义:
(1)如果输入的匹配字符串pattern不带r,那么字符串先转义一下,然后送入匹配
(2)如果输入的匹配字符串pattern不带r,那么字符串不变,直接送入匹配即可看上面的例子:
对于"((\d+), (\d+))“而言,它属于不带r的,那么需要先对该字符串进行一下转义,就变成了”((\d+), (\d+))" (注意\d是re中的语法,不是转义的意思,只有两边的括号是转移的意思);
对于r"((\d+), (\d+))“而言,它属于带r的,那么不需要转义,直接就是”((\d+), (\d+))"
匹配时转义:
将上一步的结果送入函数中进行计算。将送入的字符串进行一次转义后再匹配。看上面的例子:
不带r的,送入的字符串为:“((\d+), (\d+))”,这里面没有需要转义的字符了,因此直接匹配
带r的,送入的字符串为:“((\d+), (\d+))”,这里需要转义一下,变为"((\d+), (\d+))",然后匹配
发现到最后,带r和不带r的经过上面两个步骤后,送去匹配的字符串都是"((\d+), (\d+))",只不过不带r的是在输入时进行了转义,带r的是在匹配时进行了转义。这就是带r和不带r都能匹配的原因。
总结一下:python中的re模块在匹配正则表达式时,有两次转义过程,一次是在输入时,一次是在匹配时,两次缺一不可。
安全的相关知识
于 2022-11-06 12:53:14 首次发布