使用SoapUI测试webservice接口详细步骤
487
2022-08-31
python与正则表达式(part2)--正则表达式的转义(正则表达式 python)
文章目录
正则表达式的转义
正则表达式的转义
如果使用正则表达式来匹配特殊字符(. * + ? ^ $ [] () {} | ),则需要在特殊符号前加上【\】 表示转义。
例子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字符串 --解析为-- > 正则表达式 --匹配-- > 目标字符串 |
|
我们解释一下上面的表格的含义:如果我们用正则表达式匹配$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']
备注:原生字符串不仅仅在正则表达式中有应用,只要我们想保持原样的内容,不进行转义,都可以使用原生字符串。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~