正则表达式
千锋逆战班,Python逆战2001#
在千锋“逆战”学习Python基础 打卡第9天,
今天学习了正则表达式,
据说世界上有三种东西比较难理解:医生的处方,道士的符和程序员的正则表达式,
今天又get了一项新的技能,
一份信心,一份努力,一份成功;十分信心,十分努力,十分成功。
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用re模块。re 模块使 Python 语言拥有全部的正则表达式功能。
特点
灵活性、逻辑性和功能性非常强;
可以迅速地用极简单的方式达到字符串的复杂控制。
对于刚接触的人来说,比较晦涩难懂。
Python中的正则表达式
与大多数编程语言相同,正则表达式里也使用\作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符\,那么使用编程语言表示的正则表达式里将需要4个反斜杠\:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
print(re.match('\\\\', '\hello')) # 需要使用四个反斜杠来匹配一个 \
Python里的原生字符串
在Python 字符串前面添加r即可将字符串转换成为原生字符串。
print(re.match(r'\\', '\hello')) # 使用两个反斜杠即可匹配一个 \
查找方法的使用
- match方法(只匹配字符串开头)
- search方法(扫描整个字符串,找到第一个匹配)
- findall方法(扫描整个字符串,找到所有的匹配)
- finditer方法(扫描整个字符串,找到所有的匹配,并返回一个可迭代对象)
- match方法的使用
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern,string,flags=0)
我们可以使用group(num)函数来获取匹配表达式。
import re
result1 = re.match(r'H','Hello')
result2 = re.match(r'e','Hello')
print(result1.group(0)) # 'H' 匹配到的元素
print(result1.span()) # (0,1) 匹配到的元素所在位置
print(result2) # None
span的英文意思就是范围
- search方法的使用
re.search 扫描整个字符串并返回第一个成功的匹配。(找到第一个就行了)不要太贪
re.search(pattern, string, flags=0)
实例:
import re
result1 = re.search(r'He','Hello')
result2 = re.search(r'lo','Hello')
print(result1.group(0)) # He
print(result1.span()) # (0,2)
print(result2.group(0)) # lo
print(result2.span()) # (3,5)
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
实例:
result1 = re.search(r'天气','今天天气不错哟')
result2 = re.match(r'天气','今天天气不错哟')
print(result1) # <re.Match object; span=(2, 4), match='天气'>
print(result2) # None
- findall 方法的使用(见名知意 找到所有)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
实例代码:
ret = re.findall(r'\d+','he23ll34')
print(ret) # ['23', '34']
ret = re.match(r'\d+','he23ll34')
print(ret) # None match只匹配开头,所以匹配到
ret = re.search(r'\d+','he23ll34')
print(ret) # <re.Match object; span=(2, 4), match='23'> search 只能匹配到一个数字
- finditer方法的使用
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
ret = re.finditer(r'\d+','he23ll34') # 得到的结果是一个可迭代对象
for x in ret: # 遍历 ret 取出里面的每一项匹配
print(x.group(), x.span()) # 匹配对象里的group保存了匹配的结果
re.compile方法的使用
看下面代码你就懂了。
re.match(r'h','hello') # 可以使用re.match方法直接匹配
# 也可以调用re模块的compile方法,生成一个 Pattern 对象,再调用 Pattern 对象的 match方法
regex = re.compile(r'h')
regex.match('hello')
re.search(r'l','hello')
regex = re.compile(r'l')
regex.match('hello')
regex = re.compile(r'l')
regex.findall('hello')
regex = re.complie(r'l')
regex.finditer('hello')
re.Match类介绍
属性和方法 说 明
pos 搜索的开始位置
endpos 搜索的结束位置
string 搜索的字符串
re 当前使用的正则表达式的对象
lastindex 最后匹配的组索引
lastgroup 最后匹配的组名
group(index=0) 某个分组的匹配结果。如果index等于0,便是匹配整个正则表达式
groups() 所有分组的匹配结果,每个分组的结果组成一个列表返回
groupdict() 返回组名作为key,每个分组的匹配结果座位value的字典
start([group]) 获取组的开始位置
end([group]) 获取组的结束位置
span([group]) 获取组的开始和结束位置
expand(template) 使用组的匹配结果来替换模板template中的内容,并把替换后的字符串返回。
ret = re.search(r'(abc)+', 'xxxabcabcabcdef')
print(ret.pos) # 搜索开始的位置,默认是0
print(ret.endpos) # 搜索结束的位置,默认是字符串的长度
print(ret.group(0)) # abcabcabc 匹配整个表达式
print(ret.group(1)) # abc 第一次匹配到的结果
print(ret.span()) # (3, 12) 开始和结束位置
print(ret.groups()) # 表示当正则表达式里有多个分组时,多个分组的匹配结果
正则表达式修饰符
re.l使匹配对大小写不敏感
re.M多行匹配,影响^和$
re.S使 . 匹配包括换行在内的所有字符。
实例代码:
print(re.search(r'L','hello')) # None
print(re.search(r'L', 'hello', re.I)) # 不区分大小写<re.Match object; span=(2, 3), match='l'>
# \w+$ 表示匹配以一个或者多个字母结尾
# re.M 可以进行多行匹配,每个换行都认为是一个结尾
print(re.findall(r'\w+$','i am boy\n you are girl\n he is man',re.M)) # ['boy', 'girl', 'man']
# 不实用re.M修饰符,只会匹配到最后的 man
print(re.findall(r'\w+$','i am boy\n you are girl\n he is man')) # ['man']
print(re.search(r'.','\n')) # None . 匹配除了 \n 以外的所有字符
print(re.search(r'.','\n',re.S)) # '\n' 匹配到了 \n