当前位置 : 主页 > 编程语言 > python >

python与正则表达式(part2)--正则表达式的转义

来源:互联网 收集:自由互联 发布时间:2022-06-15
文章目录 ​​正则表达式的转义​​ 正则表达式的转义 如果使用正则表达式来匹配特殊字符(. * + ? ^ $ [] () {} | ),则需要在特殊符号前加上​​【\】​​ 表示转义。 例子1 In : re.find


文章目录

  • ​​正则表达式的转义​​

正则表达式的转义

  • 如果使用正则表达式来匹配特殊字符(. * + ? ^ $ [] () {} | ),则需要在特殊符号前加上​​【\】​​ 表示转义。

例子1

In : re.findall('-?\d+\.?\d*',"123,-123,1.23,-1.23")
Out: ['123', '-123', '1.23', '-1.23']

例子2

In :print(re.findall('\$\d+',"薪资:$100"))
Out: ['$100']
  • 在编程语言中,常使用原生字符串书写正则表达式避免多重转义的麻烦。

当我们使用re模块进行匹配时,我们输入一串python字符串,py先将python字符串解析为正则表达式,再利用正则表达式匹配目标字符串:

python字符串 --解析为-- > 正则表达式 --匹配-- > 目标字符串

​​\\$\\d+​​​ --解析为-- > ​​\$\d+​​​ --匹配-- > ​​$100​​

我们解释一下上面的表格的含义:如果我们用正则表达式匹配​​$100​​​,那么我们就要将正则表达式,以字符串的形式传给findall()做参数,那么我们如何写这个字符串来表达正则表达式呢?在字符串中我们遇到特殊字符(这里的特殊字符,是针对于python来说的特殊字符,比如​​【\】【\b】​​​等等)也需要进行转义,所以我们可以用​​\\$\\d+​​​来表示正则表达式​​\$\d+​​。故,其实最正统的例子2中的写法应该是:

In : print(re.findall('\\$\\d+',"薪资:$100"))
Out: ['$100']

那为啥例子2中的写法也对了呢? 那是因为如果我们写成​​【\\$\\d+】​​​,python会先经过字符串的转义解析,解析为​​【\$\d+】​​​。而,我们例子2中的写法​​【\$\d+】​​​,结果python无法识别。比如,对于​​【\$】​​​,由于python没有这么一个特殊字符,py无法识别,所以py就给我们原样解析了;同时,python也没有​​【\d】​​​这么一个特殊字符,所以,py也给我们原样解析了;而​​【+】​​​本身就是​​【+】​​​。所以最后,我们写成​​【\$\d+】​​也能匹配$100.

比如之前一个例子:

In : print(re.findall(r'\bis\b', "This is XiaoHuang"))
Out: ['is'] #这里输出的is,是第二个is(两边都有空格的is)

若我们不在字符串前加​​【r】​​时,python会得到什么样的结果呢?

In :print(re.findall('\bis\b', "This is XiaoHuang"))
Out: []

嗯!啥都没有~
这是为啥呢?
那是因为在python字符串中,存在特殊字符​​​【\b】​​​,表示退格。则若输入​​【\bis\b】​​​,则python会解析为​​【退格is退格】​​​,那么后面的字符串就不会被匹配。所以这里我们应该写成​​【\\bis\\b】​​:

In : print(re.findall('\\bis\\b', "This is XiaoHuang"))
Out: ['is']

那么现在问题又来了! 如果我们现在想匹配​​【薪资:$100\200】​​​中的​​【$100\200】​​​,我们该怎么写呢???
注意:当我们利用py进行匹配时,被匹配的​​【薪资:$100\200】​​​也为python字符串,所以在python中应该写为:​​【薪资:$100\\200】​​​。
这时,我们的正则表达式应该写成:​​【\$\d+\\\d+】​​,python字符串应该写成:​​【\\$\\d+\\\\\\d+】​​:

In : print(re.findall('\\$\\d+\\\\\\d+',"薪资:$100\\200"))
Out: ['$100\\200']

匹配是匹配出来了,但是……WC, 这也太冗杂了。故我们引入了原生字符串。原生字符串是指,在字符串之前加一个​​【r】​​​,使字符串内部所有可能会发生的转义,都不发生转义解析,即避免字符串内的所有转义解析。比如,在字符串前加了​​【r】​​​之后,​​【\】​​​就表示单纯的​​【\】​​​,​​【\b】​​​就表示单纯的​​【\b】​​。我们在iPython内验证一下:

In : r'\n'
Out: '\\n'

嗯!perfect!

因此,当我们用了原生字符串后,我们的正则表达式是什么样的,python字符串内,就可以写成什么样~
所以,我们上面的那个例子就可以写成:

In : print(re.findall(r'\$\d+\\\d+',r"薪资:$100\200"))
Out: ['$100\\200']

备注:原生字符串不仅仅在正则表达式中有应用,只要我们想保持原样的内容,不进行转义,都可以使用原生字符串。

上一篇:python与正则表达式(part1)--元字符
下一篇:没有了
网友评论