正则表达式的三步走:
Python字符串的转义 --》 正则表达式转义 --》 内容与转义后原始字符串内容进行匹配
import re
re.search('\\t','\t').group() #>>'\t'
1.'\\t' python字符串转义为正则表达式 \t
2.正则表达式解释 \t 为一个制表符
3.python字符串内容'\t' 转义为原始字符串 即一个制表符
4.正则表达式 与 原始(正常)字符串匹配
明确两个概念 python字符串 和 原始的字符串
原始字符串 我就想表达一个反斜杠后面加英文 即 \abc
python字符串 想表示\原始的意义需要加一个转义字符 即变成'\\abc'
正则表达式 与 原始字符串 进行匹配
例:
import re
pureStr = re.search('\\\\abc','\\abc').group() #>>'\\abc'
print(pureStr) #>>\abc
1.pyhon字符串'\\\\abc' --》 正则表达式\\abc 匹配字符串 \abc
2.python字符串'\\abc' --》 原始字符串 \abc
3.匹配字符串 与 原始字符串 一致因而能够匹配上
特殊符号的匹配
例:
1.
import re
re.search('\\~','\~').group() #>>'~'
print(re.search('\\~','\~').group()) #>>~
re.search('\\~','\~').span() #>>(1,2)
2.
import re
re.search('\\\\~','\~').group() #>>'\\~'
print(re.search('\\\\~','\~').group()) #>>\~
3.
import re
re.search('\\\\\\~','\\~').group() #>>'\\~'
print(re.search('\\\\\\~','\\~').group()) #>>\~
4.
import re
re.search('\\\\~','\\~').group() #>>'\\~'
print(re.search('\\\\~','\\~').group()) #>>\~
5.
import re
re.search('\\\\\\\\~','\\\\~').group() #>>'\\\\~'
print(re.search('\\\\\\\\~','\\\\~').group()) #>>\\~
为什么会有这种情况?
1号工作流程
1.python字符串'\\~' --》 正则表达式\~ 匹配字符串~
从这里我们可以看出正则表达式将 \特殊字符 都直接解释为该特殊字符
正则表达式 \# 匹配字符串 # 正则表达式 \= 匹配字符串 =
2.python字符串'\~' --》 原始字符串 \~
理解为什么原始字符串是\~ 而不是 ~
因为从span()方法可以看出是从母串的第二个字符匹配上的,如果python字符串'\~' 转换为原始字符串为~,那返回值应该是(0,1),从而也知道python字符串并不会转义~,但正则表达式会
3.匹配字符串 与 原始字符串 去进行匹配
2号
理解为什么group()返回的python字符串是'\\~'
因为若原始字符串是 \~ 所对应的python字符串就应该为 '\\~'
写为'\~' 不会报错因为python字符串并不会转义~,它知道你想表达的原始字符串为\~,为使得正确表达在底层实际上帮你补了一个'\',因而'\~' 实际上其实是'\\~'
这样整个工作流程也就好理解了
1.python字符串'\\\\~' --》 正则表达式 \\~ 匹配字符串 \~
2.python字符串'\~' --》 原始字符串\~
3.进行匹配
3号工作流程
1.python字符串'\\\\\\~' --》 正则表达式 \\\~ 匹配字符串 \~ (注:\\匹配\ \~匹配~)
2.python字符串'\\~' --》 原始字符串\~
3.进行匹配
4号工作流程
1.python字符串'\\\\~' --》 正则表达式 \\~ 匹配字符串 \~
2.python字符串'\\~' --》 原始字符串\~
3.进行匹配
5号工作流程
1.python字符串'\\\\\\\\~' --》 正则表达式 \\\\~ 匹配字符串 \\~
2.python字符串'\\\\~' --》 原始字符串\\~
3.进行匹配
转义字符的匹配
例:
1.
import re
re.search('\n','\n').group() #>>'\n'
print(re.search('\n','\n').group())
2.
import re
re.search('\\n','\n').group() #>>'\n'
print(re.search('\\n','\n').group())
3.
import re
re.search('\\n','\\n').group() #报错
print(re.search('\\n','\\n').group())
为什么1和2结果一样,3却报错
模拟1.流程:
1.python字符串'\n' --》正则表达式 一个换行符 匹配一个换行符
怎么理解:假设python字符串为'a' --》正则表达式 a (即一个固定a字符,这里a和换行符一个概念,都是固定字符) 因此正则表达式 a 匹配字符串 a 同理正则表达式 换行符 匹配字符串换行符
2.python字符串'\n' --》 原始字符串 一个换行符
3.进行匹配
模拟2.流程:
1.python字符串'\\n' --》正则表达式 \n 匹配字符串 一个换行符
2.python字符串'\n' --》 原始字符串 一个换行符
3.进行匹配
模拟3.流程:
1.python字符串'\\n' --》正则表达式 \n 匹配字符串 一个换行符
2.python字符串'\\n' --》 原始字符串 \n
3.换行符 与 \n 不匹配 换行符等价于字符a是一个字符,而原始字符串\n 是两个字符
总结:
说了这么多,总算把这几个概念理清楚了。
在实际运用中,还是直接 r'' 来就好了,这样就没有python字符串转义这一中间过程了
例:想匹配字符串 \sub
import re
re.search(r'\\sub',r'\this is a sample \subsription').group() #>>'\\sub'
print(re.search(r'\\sub',r'\this is a sample \subsription').group()) #>>\sub