Python正则表达式(part2):如何正确使用转义字符?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1085个文字,预计阅读时间需要5分钟。
文章目录+正则表达式的转换+正则表达式的转换+使用正则表达式进行匹配+如果使用正则表达式来匹配特定特殊字符(.+*?^$[](){}|),则需要在特殊字符前加上反斜杠[\]表示转义+表示转义。+例如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来说的特殊字符,比如等等)也需要进行转义,所以我们可以用\\$\\d+来表示正则表达式\$\d+。故,其实最正统的例子2中的写法应该是:
In : print(re.findall('\\$\\d+',"薪资:$100"))Out: ['$100']
那为啥例子2中的写法也对了呢? 那是因为如果我们写成,python会先经过字符串的转义解析,解析为。而,我们例子2中的写法,结果python无法识别。比如,对于,由于python没有这么一个特殊字符,py无法识别,所以py就给我们原样解析了;同时,python也没有这么一个特殊字符,所以,py也给我们原样解析了;而本身就是。所以最后,我们写成也能匹配$100.
比如之前一个例子:
In : print(re.findall(r'\bis\b', "This is XiaoHuang"))Out: ['is'] #这里输出的is,是第二个is(两边都有空格的is)
若我们不在字符串前加时,python会得到什么样的结果呢?
In :print(re.findall('\bis\b', "This is XiaoHuang"))Out: []
嗯!啥都没有~
这是为啥呢?
那是因为在python字符串中,存在特殊字符,表示退格。则若输入,则python会解析为,那么后面的字符串就不会被匹配。所以这里我们应该写成:
Out: ['is']
那么现在问题又来了! 如果我们现在想匹配中的,我们该怎么写呢???
注意:当我们利用py进行匹配时,被匹配的也为python字符串,所以在python中应该写为:。
这时,我们的正则表达式应该写成:,python字符串应该写成::
Out: ['$100\\200']
匹配是匹配出来了,但是……WC, 这也太冗杂了。故我们引入了原生字符串。原生字符串是指,在字符串之前加一个,使字符串内部所有可能会发生的转义,都不发生转义解析,即避免字符串内的所有转义解析。比如,在字符串前加了之后,就表示单纯的,就表示单纯的。我们在iPython内验证一下:
Out: '\\n'
嗯!perfect!
因此,当我们用了原生字符串后,我们的正则表达式是什么样的,python字符串内,就可以写成什么样~
所以,我们上面的那个例子就可以写成:
Out: ['$100\\200']
备注:原生字符串不仅仅在正则表达式中有应用,只要我们想保持原样的内容,不进行转义,都可以使用原生字符串。
本文共计1085个文字,预计阅读时间需要5分钟。
文章目录+正则表达式的转换+正则表达式的转换+使用正则表达式进行匹配+如果使用正则表达式来匹配特定特殊字符(.+*?^$[](){}|),则需要在特殊字符前加上反斜杠[\]表示转义+表示转义。+例如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来说的特殊字符,比如等等)也需要进行转义,所以我们可以用\\$\\d+来表示正则表达式\$\d+。故,其实最正统的例子2中的写法应该是:
In : print(re.findall('\\$\\d+',"薪资:$100"))Out: ['$100']
那为啥例子2中的写法也对了呢? 那是因为如果我们写成,python会先经过字符串的转义解析,解析为。而,我们例子2中的写法,结果python无法识别。比如,对于,由于python没有这么一个特殊字符,py无法识别,所以py就给我们原样解析了;同时,python也没有这么一个特殊字符,所以,py也给我们原样解析了;而本身就是。所以最后,我们写成也能匹配$100.
比如之前一个例子:
In : print(re.findall(r'\bis\b', "This is XiaoHuang"))Out: ['is'] #这里输出的is,是第二个is(两边都有空格的is)
若我们不在字符串前加时,python会得到什么样的结果呢?
In :print(re.findall('\bis\b', "This is XiaoHuang"))Out: []
嗯!啥都没有~
这是为啥呢?
那是因为在python字符串中,存在特殊字符,表示退格。则若输入,则python会解析为,那么后面的字符串就不会被匹配。所以这里我们应该写成:
Out: ['is']
那么现在问题又来了! 如果我们现在想匹配中的,我们该怎么写呢???
注意:当我们利用py进行匹配时,被匹配的也为python字符串,所以在python中应该写为:。
这时,我们的正则表达式应该写成:,python字符串应该写成::
Out: ['$100\\200']
匹配是匹配出来了,但是……WC, 这也太冗杂了。故我们引入了原生字符串。原生字符串是指,在字符串之前加一个,使字符串内部所有可能会发生的转义,都不发生转义解析,即避免字符串内的所有转义解析。比如,在字符串前加了之后,就表示单纯的,就表示单纯的。我们在iPython内验证一下:
Out: '\\n'
嗯!perfect!
因此,当我们用了原生字符串后,我们的正则表达式是什么样的,python字符串内,就可以写成什么样~
所以,我们上面的那个例子就可以写成:
Out: ['$100\\200']
备注:原生字符串不仅仅在正则表达式中有应用,只要我们想保持原样的内容,不进行转义,都可以使用原生字符串。

