首页 > 代码库 > python 正则表达式中反斜杠(\)的麻烦和陷阱
python 正则表达式中反斜杠(\)的麻烦和陷阱
这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题。
(1)、python自身处理字符串时,反斜杠是用于转义字符
(2)、正则表达式也使用反斜杠来转义字符
import re
re_str_patt = "\\\\"
reObj = re.compile(re_str_patt)
str_test = "abc\\cd\\hh"
print reObj.findall(str_test)
输出:[‘\\‘, ‘\\‘]
re_str_patt = r"\\\\"
reObj = re.compile(re_str_patt)
str_test = "abc\\cd\\hh"
print reObj.findall(str_test)
输出:[]
对于第一段代码要这么理解,首先第一重转换是字符串自身的转义,那么"\\\\",实际上就是表示两个反斜杠(两个字符),然后传入正则表达式解析器,因为反斜杠依然是转义字符,那么进行第二重转换,两个反斜杠就代表一个反斜杠,所以就能和一个反斜杠进行匹配了,那么匹配连续的两个反斜杠,写正则表达式时就要写8次"\"了,相当壮观。\d+在正则表达式里面表示匹配连续1一个以上的数字字符,可是如果想匹配:一个反斜杠,后接字母d,再接一个加号 ,这个字符串怎么写呢?(答案:"\\\\d\\+")
import re
re_str_patt = "\\\\d\\+"
print re_str_patt
reObj = re.compile(re_str_patt)
print reObj.findall("\\d+")
[‘\\d+‘]
在python中写正则表达式时用得最多的是raw字符串,原生字符串,什么意思?就是只有一重转换了,没有字符串转换了,只在正则表达式内部进行转换了,这样匹配一个反斜杠的正则表达式可以这样写,re_str_patt = r"\\"。
实例验证之一:
>>> import re
>>> s = ‘123\nabc‘ #表示的是:123 接一个换行符再接abc
>>> m = r‘123\nabc‘ #表示的是:123接一个反斜杠后接n再接abc
>>> len(s)
7
>>> len(m)
8
>>>
>>> re.subn(‘\n‘,‘x‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123xabc‘, 1)
>>> re.subn(‘\\n‘,‘x‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123xabc‘, 1)
>>> re.subn(‘\\\n‘,‘x‘,s) #正则表达式匹配的是:一个换行符(有待推敲)
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123xabc‘, 1)
>>> re.subn(‘\\\\n‘,‘x‘,s) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123\nabc‘, 0)
>>> re.subn(‘\n‘,‘x‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
>>> re.subn(‘\\n‘,‘x‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
>>> re.subn(‘\\\n‘,‘x‘,m) #正则表达式匹配的是:一个换行符(有待推敲)
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
>>> re.subn(‘\\\\n‘,‘x‘,m) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123xabc‘, 1)
>>>
>>>
>>> re.subn(r‘\n‘,‘x‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123xabc‘, 1)
>>> re.subn(r‘\\n‘,‘x‘,s) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123\nabc‘, 0)
>>> re.subn(r‘\\\n‘,‘x‘,s) #正则表达式匹配的是:一个反斜杠接一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123\nabc‘, 0)
>>> re.subn(r‘\\\\n‘,‘x‘,s) #正则表达式匹配的是:两个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
(‘123\nabc‘, 0)
>>> re.subn(r‘\n‘,‘x‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
>>> re.subn(r‘\\n‘,‘x‘,m) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123xabc‘, 1)
>>> re.subn(r‘\\\n‘,‘x‘,m) #正则表达式匹配的是:一个反斜杠接一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
>>> re.subn(r‘\\\\n‘,‘x‘,m) #正则表达式匹配的是:两个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
(‘123\\nabc‘, 0)
实例验证之二:
>>> import re
>>> s = ‘123\nabc‘
>>> m = r‘123\nabc‘
>>> len(s)
7
>>> len(m)
8
>>>
>>> re.findall(‘\n‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
[‘\n‘]
>>> re.findall(‘\\n‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
[‘\n‘]
>>> re.findall(‘\\\n‘,s) #正则表达式匹配的是:一个换行符(有待推敲)
#要匹配的字符串s为:123 接一个换行符再接abc
[‘\n‘]
>>> re.findall(‘\\\\n‘,s) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
[]
>>> re.findall(‘\n‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
>>> re.findall(‘\\n‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
>>> re.findall(‘\\\n‘,m) #正则表达式匹配的是:一个换行符(有待推敲)
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
>>> re.findall(‘\\\\n‘,m) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[‘\\n‘]
>>>
>>>
>>> re.findall(r‘\n‘,s) #正则表达式匹配的是:一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
[‘\n‘]
>>> re.findall(r‘\\n‘,s) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
[]
>>> re.findall(r‘\\\n‘,s) #正则表达式匹配的是:一个反斜杠接一个换行符
#要匹配的字符串s为:123 接一个换行符再接abc
[]
>>> re.findall(r‘\\\\n‘,s) #正则表达式匹配的是:两个反斜杠接n
#要匹配的字符串s为:123 接一个换行符再接abc
[]
>>> re.findall(r‘\n‘,m) #正则表达式匹配的是:一个换行符
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
>>> re.findall(r‘\\n‘,m) #正则表达式匹配的是:一个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[‘\\n‘]
>>> re.findall(r‘\\\n‘,m) #正则表达式匹配的是:一个换行符(有待推敲)
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
>>> re.findall(r‘\\\\n‘,m) #正则表达式匹配的是:两个反斜杠接n
#要匹配的字符串m为:123接一个反斜杠后接n再接abc
[]
python 正则表达式中反斜杠(\)的麻烦和陷阱