一,正则表达式()
正则表达式本身与python没什么关系,就是匹配字符串内容的一种规则,只和字符串相关。
定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符、及这些特殊字符的组合,组合一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1,字符组,[字符组],在同一位置可能出现的各种字符组成一个字符组,在在正则表达式中用[]表示。
2,元字符:. , 匹配除换行符以外的任意字符
\w,匹配字符或数字或下划线,\W,匹配非字母或下划线或数字
\s,匹配任意空白字符,\S,匹配非空白字符
\d,匹配数字, \D,匹配非数字
\n,匹配一个换行符,\t,匹配一个制表符,\b,匹配一个单词的结尾
^,匹配字符串的开始,$,匹配字符串的结尾,a|b,匹配字符a或字符b
(),匹配括号内表达式,也表达一个组
[...],匹配字符组中的字符,[^...],匹配除了字符组中字符的所有字符
3,量词
*,+,?,{n},{n,},{n,m},默认情况下,采用贪婪匹配。尽可能匹配长的字符串。
在量词后面加?,就是非贪婪匹配,尽可能匹配短的字符串。
转义符,python中,在字符串前加r,例r“\d”
.*?的用法:.*?x,就是取前面任意长度的字符,直到一个x出现
二,re模块
re模块下的常用方法
import re# ret=re.findall("s","she is girs") #返回所有满足匹配条件的结果,放在列表里# print(ret)# ret=re.search("s","zhe is girs").group() #函数会在字符串内查找,只找到第一个匹配,就返回一个包含信息的对象,该对象可以# print(ret) #通过调用group()方法得到匹配的字符串,如果没有,则返回None,调用group会报错# ret=re.match("a","zhe is girs") #和search一样,但在字符串开始处匹配,匹配不到,就没有,报错# print(ret.group())# ret=re.split("[ab]","abdf") #先按"a"分割得到""和"bdf",再对""和"bdf"分别按"b"分割,结果['', '', 'df']# print(ret) #如果不加中括号,则按"ab"分割,结果['', 'df']# ret=re.subn("\d","r","we1rer23g4") #将数字替换成"r",返回元组(替换的结果,替换了多少次(可设置))# print(ret)# see=re.compile("\d{3}") #将正则表达式编译成为一个正则表达式对象,规则要匹配的3个数字# ret=see.search("asd34r345rr")# print(ret.group()) #345# ret=see.sub("\d","r","we1rer23g4",1) #将数字替换成"r",参数1表示只替换一个# print(ret)# ret=re.finditer("\d","da3gf4h4") #finditer返回一个存放匹配结果的迭代器# print(ret) ## print(next(ret).group())# print(next(ret).group())# print([i.group()for i in ret])# for i in ret:# print(i.group())
优先级
#findall的优先级# ret=re.findall("www.(biadu|oldboy).com","www.oldboy.com")# print(ret) #['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可## ret=re.findall("www.(?:biadu|oldboy).com","www.oldboy.com")# print(ret) #['www.oldboy.com']# split的优先级# ret=re.split("\d","eva4your3yuan2she")# print(ret) #['eva', 'your', 'yuan', 'she']# ret=re.split("(\d)","eva4your3yuan2she")# print(ret) #['eva', '4', 'your', '3', 'yuan', '2', 'she']# #在匹配部分加上()之后所切出来结果是不同的# #没有()的没有保留所匹配的项,但有()的可以保留匹配的项