一、re模块
string 提供的方法是完全匹配
引入正则:模糊匹配
import re
eg:
ret = re.findall(‘w\w{2}l’,‘hello world’)
print(ret)
ret = re.findall(‘w.l’,‘hello world’) # .只能代指一个字符
print(ret)
元字符
元字符: . ^ $ * + ? { } [ ] | ( ) \
1 . 通配符
ret = re.findall(‘w…l’,‘hello w\t ld’)
print(ret)
2 ^ 尖角符 只在开始匹配 既从 第一个开始
ret = re.findall(’^h…o’,‘hdsfgcashello’)
print(ret)
3 $ 相反于尖角符 它是只从结尾匹配
ret = re.findall(‘a…x$’,‘hsisdksdalexddauyx’)
print(ret)
4 重复匹配
* 重复匹配 [0,oo] 0到正无穷
ret = re.findall(‘ba*’,‘dsjajdsnbaaaaaaa’)
print(ret)
+ 重复匹配 [1,oo] 1到正无穷 至少有一次
ret = re.findall(‘ab+’,‘sdsdfah’) #匹配b 至少出现一次b
print(ret)
ret = re.findall(‘a+b’,‘aaabgdasdb’) #匹配a 至少出现一次a
print(ret)
? 重复匹配 [0,1] 0次或一次
ret = re.findall(‘a?b’,‘aaaabhdabdfb’) #匹配a
print(ret)
{} 精确匹配 大括号里面什么都没有 默认正无穷
ret = re.findall(‘a{1,3}b’,‘b’)
print(ret)
结论: * 等于 {0,正无穷}
+ 等于 {1,正无穷}
? 等于 {0,1}
6.字符集 [] 相当于一个或的关系
ret = re.findall(‘a[cd]x’,‘adx’) #即[]里面c或d都可以
print(ret)
ret = re.findall(’[a-z]’,‘adx’) #这里表示一个范围
print(ret)
另外
[]字符集: 取消元字符的特殊功能(\ ^ -),括号内三个例外
ret = re.findall(’[w,]’,'adwx’) #这里的就是号
print(ret)
ret = re.findall(’[1-9a-zA-Z]’,‘12sdDS’) #这里的- 就没有被取消功能
ret = re.findall(’[1-9,a-z,A-Z]’,‘12sdDS’)
print(ret)
^ 放在[]里 : 取反
ret = re.findall(’[^iu]’,‘iu12sdDS’) #除了iu 都匹配
print(ret)
ret = re.findall(’[^4,5]’,‘iu4dfs5D’) #除了4和5 都匹配 这里 4 5 是一个整体
print(ret)
反斜杠后边跟元字符去除特殊功能
反斜杠后边跟普通字符实现特殊功能
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
print(re.findall(’\d{11}’,‘asdsfda122345451215sd4fsas’))
输出结果:[‘12234545121’]
print(re.findall(’\sasd’,‘fak asd’))
输出结果:[’ asd’]
print(re.findall(’\w’,‘fak asd’))
输出结果:[‘f’, ‘a’, ‘k’, ‘a’, ‘s’, ‘d’]
\b 匹配一个特殊字符边界
print(re.findall(r’I\b’,‘hello,I am a LI$T’))
[‘I’, ‘I’]
##############################################################
re.search() 匹配出满足条件的第一个结果
print(re.search(‘sb’,‘sdsfadsbdsfsasdsb’)) #得到一个对象
输出结果:<_sre.SRE_Match object; span=(6, 8), match=‘sb’>
ret = re.search(‘sb’,‘sdsfadsbdsfsasdsb’) #取出对象里面的内容
print(ret.group())
\后面加元字符 使得元字符没有特殊意义
ret = re.search(‘a\.’,‘a.gj’).group()
print(ret)
输出结果:a.
重点:
import re
ret=re.findall(‘c\l’,‘abc\le’)
print(ret)#[]
ret=re.findall(‘c\\l’,‘abc\le’)
print(ret)#[]
ret=re.findall(‘c\\\\l’,‘abc\le’)
print(ret)#[‘c\\l’]
ret=re.findall(r’c\\l’,‘abc\le’)
print(ret)#[‘c\\l’]
这里的 不加r \\\\ 为什么就能匹配出来呢?
#因为两个\\是在re模块中 两个\\是在python解释器下
加r \\能够匹配出来
因为加r告诉了python解释器这里的\\是re模块里面的
可以参照文件夹里面的图片
m = re.findall(’\bblow’, ‘blow’)
print(m)
m = re.findall(r’\bblow’, ‘blow’)
print(m)
8.() |
print(re.search(’(as)+’,‘sdsaasas’).group()) #asas
()是将括号里面的as作为一个整体 来查找
print(re.search(’(as)|3’,‘3as’).group()) #as
| 是 或 的意思
正则表达式的方法
- findall(): 所有结果都返回一个列表里
- search(): 返回匹配到的第一个对象(object),对象可以调用group()返回结果
3.match(): 只在字符串开始匹配,也只返回一个对象。用group返回结果
ret = re.match(‘asd’,‘asdasasd’)
print(ret)
4.split() 分割
ret = re.split(’[s,k]’,‘dsdsfkda’)
print(ret)
ret = re.split(’[s,k]’,‘sdsfkda’) #******
print(ret)
输出结果:[’’, ‘d’, ‘f’, ‘da’]
5.sub 替换
ret = re.sub(‘a…x’,‘soob’,‘sdjskdjaalexdnsd’)
print(ret)
6.compile #把规则编译成对象,方便调用
obj = re.compile(’\.com’)
ret = obj.findall(‘www.baidu.com’)
print(ret)