正则表达式:匹配或查找符合某些规则的字符串数据
python中通过正则表达式对字符串进行匹配需要使用re模块
匹配单个字符
符号 | 功能 |
---|---|
. | 匹配任意一个字符 |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空格 |
\S | 匹配非空格 |
\w | 匹配非特殊字符,即a-z,A-Z,0-9,(下划线),汉字 |
\W | 匹配特殊字符 |
匹配多个字符
符号 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次 |
+ | 匹配前一个字符出现1次或者无限次 |
? | 匹配前一个字符出现1次或者0次 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现m到n次 |
匹配开头和结尾
符号 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
匹配分组
符号 | 功能 |
---|---|
| | 匹配其左右任意一个表达式 |
(ab) | 括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符 |
(?p<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
基本使用方法
1、match匹配
match方法默认从头开始匹配,只匹配一次
基本格式:
result = re.match(正则表达式,要匹配的字符串)
匹配成功则返回match对象,匹配失败返回None,需使用group方法提取匹配结果数据。
import re
ret = re.match('hello','hello world')
print(type(ret)) # <class '_sre.SRE_Match'>
print(ret) # <_sre.SRE_Match object; span=(0, 5), match='apple'>
if ret:
# 使用group方法提取数据
print(ret.group()) # hello
2、search匹配
search方法在字符串汇总任意位置进行查找,且只查找一次
基本格式:
result = re.search(正则表达式,要匹配的字符串)
匹配成功则返回match对象,匹配失败返回None,需使用group方法提取匹配结果数据。
import re
ret = re.search('\d+','crawl 10 spider 20')
print(type(ret)) # <class '_sre.SRE_Match'>
print(ret) # <_sre.SRE_Match object; span=(6, 8), match='10'>
if ret:
print(ret.group()) # 10
3、findall查找
findall方法从任意位置查找,匹配多次,将匹配结果一次性返回,返回形式为列表
基本格式:
result = re.findall(正则表达式,要匹配的字符串)
匹配成功则返回list对象,匹配失败返回空列表。
import re
ret = re.findall('\d+','crawl 10 spider 20')
print(type(ret)) # <class 'list'>
print(ret) # ['10', '20']
4、sub替换
sub方法从任意位置进行匹配,匹配成功后将匹配到的数据进行替换
基本格式:
result = re.sub(正则表达式,替换字符串,要匹配的字符串,count = 替换次数)
sub方法中用count参数指定替换次数,不指定或count=0时默认全部替换
匹配成功返回替换后的字符串,匹配失败则返回原始字符串
import re
ret = re.sub('\d+','111','crawl 10 spider 20',count=1)
print(type(ret)) # <class 'str'>
print(ret) # crawl 111 spider 20
5、split根据匹配进行切割字符串
split方法
基本格式:
result = re.split(正则表达式,要匹配的字符串,maxsplit= 替换次数)
split方法中用maxsplit参数指定分割次数,默认全部分割
匹配成功返回分割后的字符串列表,匹配失败则整个用于匹配的字符串作为列表的一项进行返回
import re
ret = re.split(',', 'apple, pear, grape, cherry',maxsplit=1)
print(type(ret)) # <class 'list'>
print(ret) # ['apple', ' pear, grape, cherry']
贪婪和非贪婪
python中数量词默认是贪婪地,总是尝试匹配尽可能多的字符,非贪婪则相反,总是尝试匹配尽可能少的字符
非贪婪字符 | ? |
---|
在‘*’,‘?’,‘+’,‘{m,n}’后面加上非贪婪符,使贪婪编程非贪婪
贪婪:正则匹配中从左到右顺序求值时,会尽量抓取满足匹配最长的字符串
import re
str = "this is a number 234-234-234-234"
ret = re.match('.+(\d+-\d+-\d+-\d+)',str)
if ret:
# 获取分组数据
print(ret.group(1)) # 4-234-234-234
非贪婪:加上非贪婪字符使分组前的数据尽可能少的匹配字符
import re
str = "this is a number 234-234-234-234"
ret = re.match('.+?(\d+-\d+-\d+-\d+)',str)
if ret:
# 获取分组数据
print(ret.group(1)) # 234-234-234-234