正则表达式:匹配或查找符合某些规则的字符串数据
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
正则表达式实战指南
本文详细介绍正则表达式的使用方法,包括匹配单个字符、多个字符、分组及贪婪与非贪婪匹配等核心概念。并提供了Python中re模块的基本使用示例,如match、search、findall、sub和split等函数的应用。
803

被折叠的 条评论
为什么被折叠?



