一,正则表达式
普通的匹配都为完全匹配
正则表达式为模糊匹配
## 元字符
. ^ $ * + ? {} [] ()
### .:一个点代表匹配一个字符 >>> re.findall("he..o","abchelloabc") ['hello'] >>>
### ^:在字符串的开头进行匹配, >>> re.findall("^hello","ahello") [] >>> re.findall("^hello","helloabc") ['hello'] >>>
### $:以什么进行结尾 >>> re.findall("hello$","abchello") ['hello'] >>>
### *:按着挨着的字符进行重复(0~无穷) >>> re.findall("o*","helloworldoooooaooo") ['', '', '', '', 'o', '', 'o', '', '', '', 'ooooo', '', 'ooo', ''] >>>
### +:按着挨着的字符进行重复(1~无穷) 至少有一个,贪婪匹配 >>> re.findall("o+","helloworldoooooaooo") ['o', 'o', 'ooooo', 'ooo'] >>> >>> re.findall("hello+","helloworldoooooaooo") ['hello'] >>>
### ?:按着挨着的字符进行重复(1~0) ,最多为1个 >>> re.findall("o?","helloworldoooooaooo") ['', '', '', '', 'o', '', 'o', '', '', '', 'o', 'o', 'o', 'o', 'o', '', 'o', 'o', 'o', ''] >>> >>> re.findall("hello?","helloworldoooooaooo") ['hello'] >>>
{}:可以表示前面三种的情况 {0,} == * {1,} == + {0,1} == ? {6}表示可以重复6次 {1,6}表示可以重复1~6中任意的次数
### 将贪婪匹配变成惰性匹配, ### 在原本*号的后面加上一个?,将贪婪匹配变成惰性匹配 >>> re.findall("hello*?","abchelloabc") ['hell'] >>> >>> re.findall("hello+?","abchelloabc") ['hello'] >>>
# 元字符集[] >>> re.findall("x[yz]","xyssssssxzjxpjjjj") ['xy', 'xz'] >>> >>> re.findall("x[yzp]","xyssssssxzjxpjjjj") ['xy', 'xz', 'xp'] >>>
注:元字符集中的符号大多数为普通符号 如 * + ? ### 元字符集中有特殊意义的为 - ^ ### 一个星只匹配一个符号 >>> re.findall("g[e*x]","fefefalgeeexxxx") ['ge'] >>>
### []与- #[a-z]匹配a~z中的一个元素 >>> re.findall("g[a-z]","feaafgua") ['gu'] >>> >>> re.findall("g[a-z]*","feaafgua") ['gua'] >>>
### [0-9]匹配0~9 >>> re.findall("g[0-9]*","abcg123") ['g123'] >>>
### []与^与- ### 注:^表示的是非的意思 ### 匹配非0~9的字符 >>> re.findall("g[^0-9]","feaafgua") ['gu'] >>>
### 匹配非a~z的字符 >>> re.findall("g[^a-z]*","feaafg4415ua") ['g4415'] >>> re.findall("g[^a-z]*","feaafg44s15ua") ['g44'] >>>
### 元字符转义字符 ### d 匹配任何的十进制数 >>> re.findall("d","12+(23+34)") ['1', '2', '2', '3', '3', '4'] >>> re.findall("d+","12+(23+34)") ['12', '23', '34'] >>>
### D 匹配任何非数字字符 >>> re.findall("D","12+(23+34)") ['+', '(', '+', ')'] >>>
### s 匹配任何空白字符 >>> re.findall("s","hello world") [' '] >>>
### S 匹配任何非空白字符 >>> re.findall("S","hello world") ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'] >>> re.findall("S+","hello world") ['hello', 'world'] >>>
### w 匹配任何字母,数字字符 相当于a-z A-Z 0-9 >>> re.findall("w","hello world111") ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '1', '1'] >>> re.findall("w+","hello world111") ['hello', 'world111'] >>> >>> re.findall("w+","hello world111_+") ['hello', 'world111_'] >>>
### W 匹配任何非数字,非字母字符 >>> re.findall("W","abc123?._") ['?', '.'] >>>
### 匹配一个特殊字符边界,比如空格 & # >>> re.findall(r"I","hello I am LIST") ['I'] >>> >>> re.findall("I\b","hello I am LIST") ['I'] >>>
### 元字符之| |:俗称管道符 >>> re.findall("ka|b","asdffka|b") ['ka', 'b'] >>> re.findall("ka|b","asdffkab") ['ka', 'b'] >>>
### 元字符之分组() 注:search() # 匹配字符串,只要匹配到一个就不再往下匹配 >>> re.findall("d+","fadf55adfa85af58") ['55', '85', '58'] >>> re.search("d+","fdfd58fdfd11df5df") <_sre.SRE_Match object at 0x028EFA68> # 得到的是一个对象 >>> re.search("d+","fdfd58fdfd11df5df").group() # 利用group得出结果 '58' >>> >>> re.search("[a-z]+","123hello123abc").group() 'hello' >>>
### (?P<id>[a-z]+)自定义一个分组,分组名称为id >>> re.search("(?P<id>[a-z]+)","123hello123abc").group() 'hello' >>> >>> re.search("(?P<id>[a-z]+)d","123hello123abc").group() 'hello1' >>> >>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group() 'hello123' >>> >>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group("id") 'hello' >>>
## r
re.findall(r"I","hello I am LIST")
上方代码中 r 表示的作用:加上r表示对所处理的字符不做任何的转义,因为Python在进行解释时,会对转义字符进行转义,而re模块也会对转义字符进行转义,所以会照成干扰,加上r后,Python不对其进行转义,直接让re模块进行解释
\b:Python对程序进行解释时,将其转义为,而后re模块对其进行解释,re表达式只能认为是
r"\b":Python对程序进行解释时,不进行转义,而直接给re模块进行处理
# 一种不使用 r 的方法 re.findall("c\\l") python对其进行转义,转义成c\l # 而后re对其再次进行转义,转义成cl # 所以将\\转义成
>>> re.findall("I\\l","hello I am LIlST") ['I\l'] >>> # 注:上方的结果为两个反斜杠,因为返回到python中时又添加了一个,表示
. 表示一个普通点
* 表示一个普通*
## re中常用的方法
#1 findall
#2 search
#3 match("a","abc").group() # 用法与search,不同于match只取头
#4 >>> re.split("[ab]","abcd") # 先按a进行分割,得到''和'bcd',再将''和'bcd’按b进行分割 ['', '', 'cd']
#5 sub替换,具有三个参数 >>> re.sub("d+","A","hello1998World") # 将其中的数字替换为A 'helloAWorld' >>> re.sub("d","A","hello1998World") # 将其中的每个数字替换为A 'helloAAAAWorld' >>> re.sub("d","A","hello1998World",2) # 后加参数2,匹配前两个数字 'helloAA98World'
#6 >>> re.subn("d","A","hello1998World") # 输出匹配后的内容与匹配的次数 ('helloAAAAWorld', 4)
#7 com = re.compile("d") # 将要匹配的规则存到com中 # 可以重复使用com >>> com = re.compile("d") >>> com.findall("dfadfd1fwe33adf") ['1', '3', '3']
#8 >>> re.finditer("d+","efwerfqw1212rtfgwe4454") <callable-iterator object at 0x03008170> >>> # 与findall区别是返回一个迭代器对象 # 好处:当处理大量数据是,不需要将所有的数据全部存放到内存中,而是存放到迭代器中 >>> ret = re.finditer("d+","efwerfqw1212rtfgwe4454") >>> next(ret).group() # 用next读取 '1212' >>> next(ret).group() '4454' >>>
# 注注:当使用分组时,re默认会将括号中分组的内容优先拿出,如下所示 >>> re.findall("www.(baidu|sina).com","www.baidu.com") ['baidu']
# 去优先级:加上?: >>> re.findall("www.(?:baidu|sina).com","www.baidu.com") ['www.baidu.com']
# 补充 >>> re.findall("(abc)+","abcabcabc") # 括号有优先级,只显示一个 ['abc'] >>> re.findall("(?:abc)+","abcabcabc") # 用?:取消优先级 ['abcabcabc']