一,正则表达式
普通的匹配都为完全匹配
正则表达式为模糊匹配
## 元字符
. ^ $ * + ? {} [] () \
### .:一个点代表匹配一个字符>>> 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?._")['?', '.']>>>
### \b 匹配一个特殊字符边界,比如空格 & # >>> re.findall(r"I\b","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[a-z]+)自定义一个分组,分组名称为id>>> re.search("(?P [a-z]+)","123hello123abc").group()'hello'>>>>>> re.search("(?P [a-z]+)\d","123hello123abc").group()'hello1'>>>>>> re.search("(?P [a-z]+)\d+","123hello123abc").group()'hello123'>>>>>> re.search("(?P [a-z]+)\d+","123hello123abc").group("id")'hello'>>>
## r
re.findall(r"I\b","hello I am LIST")
上方代码中 r 表示的作用:加上r表示对所处理的字符不做任何的转义,因为Python在进行解释时,会对转义字符进行转义,而re模块也会对转义字符进行转义,所以会照成干扰,加上r后,Python不对其进行转义,直接让re模块进行解释
\\b:Python对程序进行解释时,将其转义为\b,而后re模块对其进行解释,re表达式只能认为是 \b
r"\\b":Python对程序进行解释时,不进行转义,而直接给re模块进行处理
# 一种不使用 r 的方法re.findall("c\\\\l")python对其进行转义,转义成c\\l# 而后re对其再次进行转义,转义成c\l# 所以将\\\\转义成\
>>> re.findall("I\\\\l","hello I am LI\lST")['I\\l']>>># 注:上方的结果为两个反斜杠,因为返回到python中时又添加了一个,表示\
\. 表示一个普通点
\* 表示一个普通*## re中常用的方法
#1findall
#2search
#3match("a","abc").group() # 用法与search,不同于match只取头
#4>>> re.split("[ab]","abcd") # 先按a进行分割,得到''和'bcd',再将''和'bcd’按b进行分割['', '', 'cd']
#5sub替换,具有三个参数>>> 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)
#7com = re.compile("\d") # 将要匹配的规则存到com中# 可以重复使用com>>> com = re.compile("\d")>>> com.findall("dfadfd1fwe33adf")['1', '3', '3']
#8>>> re.finditer("\d+","efwerfqw1212rtfgwe4454")>>># 与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']