这篇文章主要是讲 re模块的四个常见方法
re.match()
re.search()
re.findall()
re.sub()
的作用,参数,返回值类型,示例代码
如果对python正则表达式匹配规则不太熟悉的同学,可以先看看我下面这篇博客
常用的正则表达式规则 https://blog.csdn.net/weiyang_tang/article/details/82807656
re.match(pattern, string, flags=0)
作用:
re.match 尝试从字符串的起始位置匹配一个模式(pattern),如果不是起始位置匹配成功的话,match()就返回None
参数:
pattern:正则表达式(或者正则表达式对象)
string:要匹配的字符串
flags:修饰符,见下表
返回值的类型
匹配成功re.match方法返回一个匹配的对象,否则返回None
函数
group()匹配成功,返回匹配的字符串,否则抛出异常
group(i)匹配成功,则返回第i个(正则表达式)里的字符串,否则抛出异常
span()匹配成功,则返回匹配成功的位置,否则抛出异常
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小不敏感 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
未全部列出,常用的就是re.I和re.S
import re
content='Hello 2018,I am happy'
regex='\w+.*?\d{4}.*?\w'
result=re.match(regex,content)
if result!=None:
print(result.group())
else:
print('None')
print()
regex_2='\d{4}.*?\w'
result=re.match(regex_2,content)
if result!=None:
print(result.group())
else:
print('None')
#(.*?)表示尽可能少的匹配字符
结果:
Hello 2018,I
None
小插曲
Python报错
AttributeError: 'NoneType' object has no attribute 'group'
解决方法
AttributeError: ‘NoneType’ object has no attribute ‘group’
(https://blog.csdn.net/weiyang_tang/article/details/82806920)
在正则表达式里,要获取的字符串用 ()表示
import re
content='Hello 1234567 world_this I love you'
regex='^Hello\s(\d+)\s(\w+)'
result=re.search(regex,content)
print(result)
print(result.group())
print(result.group(1)) #匹配的是括号里的(\d+)
print(result.group(2)) #匹配的是括号里的(\w+)
结果:
Hello 1234567 world_this
1234567
world_this
re.search(pattern, string, flags=0)
作用:
函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
注意只返回第一个匹配成功的字符串
参数:
pattern:正则表达式(或者正则表达式对象)
string:要匹配的字符串
flags:修饰符,见下表
返回值的类型
匹配成功re.search方法返回一个匹配的对象,否则返回None
re.match()和re.search()用法类似
唯一的区别在于re.match()从字符串头开始匹配,若头匹配不成功,则返回None
不同的地方在于,返回的是一个列表,即返回所有匹配成功的字符串
举个例子:
import re
html = '''
2002的第一场雪
我在佛前苦苦求了几千年
无敌是多么寂寞
沧海一声笑
光辉岁月
童年
'''
regex_4='(.*?)'
results=re.findall(regex_4,html,re.S)
print(results) # 把所有的歌名提取打印出来
for result in results:
print(result)
结果:
['2002的第一场雪', '我在佛前苦苦求了几千年', '无敌是多么寂寞', '沧海一声笑', '光辉岁月', '童年']
2002的第一场雪
我在佛前苦苦求了几千年
无敌是多么寂寞
沧海一声笑
光辉岁月
童年
- sub()
用法都是类似的,
区别:sub()用于替换
sub(pattern, repl, string, count=0, flags=0):
参数:
pattern:正则表达式(或者正则表达式对象)
repl:替换的字符串
string:要匹配的字符串
flags:修饰符,见下表
例子
# -*- coding: utf-8 -*-
# @Time : 2018/9/21 8:55
# @Author : Tangweeiyang
# @File : regex_04_sub.py
import re
str='I12LO1%V258%E.,,,,L351N896'
regex_1='\d+|\W+'
result=re.sub(regex_1,'',str)
print(result,'\n')
str_2='I我LOVE爱刘LN***********妮*********'
regex_1='\d+|\W+'
#\d表示数字,+表示1个或者多个,\W(大写的W)表示非数字.字母.下划线的其他字符(比如标点符号,\t\n\f\r),a|b表示匹配a或者b
#我刚刚发现一个有趣的现象,\w是可以匹配汉字的
#\w匹配的是能组成单词的字符,在python3 中re默认支持的是unicode字符集,当然也支持汉字
result=re.sub(regex_1,'',str_2)
print(result,'\n')
#不匹配汉字[\u4e00-\u9fa5]
regex_2='[\u4e00-\u9fa5]'
result=re.sub(regex_1,'',str_2)
result=re.sub(regex_2,'',result)
print(result)
regex_3='[\d\W\u4e00-\u9fa5]'
result=re.sub(regex_3,'',str_2)
print(result)
#compile()函数的运用
pattern=re.compile(regex_3)
result=re.sub(pattern,'',str_2)
print(result)
结果:
ILOVELN
I我LOVE爱刘LN妮
ILOVELN
ILOVELN
ILOVELN