python高级之正则表达式
四、正则表达式
正则表达式就是记录文本规则的代码
在python中使用正则表达式需要先导入re模块
4.1匹配单个字符
代码 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W | 匹配特殊字符,即非字母、非数字、非汉字 |
如:match_obj = re.match(“t.o”, “two”)
if match_obj:
获取匹配结果
print(match_obj.group())
else:
print(“匹配失败”)
4.2匹配多个字符
代码 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
4.3匹配开头结尾
代码 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
4.4匹配分组
代码 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
如:match_obj = re.match(“t.o”, “two”)
if match_obj:
print(match_obj.group())
else:
print(“匹配失败”)
示例1:|
需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配apple和pear
import re
# 水果列表
fruit_list = ["apple", "banana", "orange", "pear"]
# 遍历数据
for value in fruit_list:
# | 匹配左右任意一个表达式
match_obj = re.match("apple|pear", value)
if match_obj:
print("%s是我想要的" % match_obj.group())
else:
print("%s不是我要的" % value)
4.5re模块的高级用法
(1)search
根据正则表达式查找指定数据,只查找一次结果
格式:re.search(“正则表达式”,“要匹配的字符串”)
(2)findall
根据正则表达式查找指定数据,会全部查找,会返回一个结果列表
格式:re.findall(“正则表达式”,“要匹配的字符串”)
(3)sub
根据正则表达式查找指定数据,将匹配到的数据进行替换,默认会全部替换,可用count=num进行指定替换次数
格式:re.sub(“正则表达式”,“替换后的数据”,“要匹配的字符串”,count=1)
如:
match_obj-》 sub函数匹配完成以后会自动传入该参数
def add(match_obj):
获取匹配结果
value = match_obj.group()
result = int(value) + 1
返回数据类型必须是字符串
return str(result)
value = re.sub("\d+", add, “阅读数:11”)
print(value)
(4)split
根据正则表达式匹配,进行切割字符串,并返回一个列表,默认全部分割,可用maxsplit=num进行指定分割次数
格式:re.split(“正则表达式”, “要匹配的字符串”, maxsplit=1)
4.6贪婪和非贪婪
(1)贪婪:根据正则表达式尽量多匹配数据,python里面正则默认是贪婪的
提示:如果以后开发过程中使用正则匹配数据比预想的数据要多,要想到非贪婪模式
(2)非贪婪:根据正则表达式尽量少匹配数据
提示:?后面的数据不跟前面的正则表达式匹配,留给后面的代码进行匹配
如:
match_obj = re.search(r"https??/.*?.jpg", my_str)
if match_obj:
获取匹配结果对象
print(match_obj.group())
else:
print(“匹配失败”)
4.7r的作用
r:表示原始数据,不需要对反斜杠进行转义,r里面的反斜杠是一个真正反斜杠
建议:以后使用正则表达式可以统一加上r
转义字符:用\来对字符进行转义,如想查找*,就得写成*