版权声明:内容版权为CSDN用户:kayseen 所有,若您需要引用、转载,需要注明来源及原文链接 https://blog.csdn.net/m0_43394876/article/details/88371840
- 匹配到的全是字符串,
- print(xxx.group()) group后面的括号默认序号是0,表示的是匹配出来的整个内容,然后从左到右排序1234…
- [^指定字符]表示除了指定字符都匹配
- {m,}最少出现m次最多无数次
1.re模块示例
- re模块示例
# 导入 re 模块
import re
# re.match() 根据正则表达式从头开始匹配字符串数据
result = re.match("itcast","itcast.cn")
# print 打印结果
print(result.group())
# 运行结果为:
itcast
2.匹配单个字符
代码 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符, 比如[0-5]表示0,1,2,3,4,5 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W | 匹配特殊字符,即非字母、非数字、非汉字 |
3.匹配多个字符
代码 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
import re
match_obj = re.match("t.+o", "two")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
运行结果:
two
#匹配 qq:10567
match_obj = re.match("qq:[1-9]\d{4,10}", "qq:10567")
print(match_obj.group())
4.匹配开头和结尾
代码 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
import re
# 匹配以数字开头的数据
match_obj = re.match("^\d.*", "3hello")
print(match_obj.group())
运行结果: 3hello
import re
# 匹配以数字结尾
match_obj = re.match(".*\d$", "xxsdf;kj;5")
print(match_obj.group())
1.除了指定字符以外都匹配
-
[^指定字符]表示除了指定字符都匹配
import re match_obj = re.match("[^aeiou]", "h") print(match_obj.group())
5.匹配分组
代码 | 功能 |
---|---|
| 管道符 | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num |
引用分组num匹配到的字符串 |
(?P) |
给分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
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)
2. (ab)
需求:匹配出163、126、qq等邮箱
import re
match_obj = re.match("[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com", "[email protected]")
if match_obj:
print(match_obj.group())
# 获取分组数据
print(match_obj.group(1))
else:
print("匹配失败")
3. \num
- 值全部一样分才能调用 \num
- 注: <>是固定的,用()将里面的内容标为一个整体,后面如果内容相同,可以用\num序号来调用.
match_obj = re.match(r"<([a-zA-Z1-6]+)>.*</\1>", "<html>hh</html>")
if match_obj:
# 提示: group()默认获取的是第0个分组数据,其实就是整个匹配到的数据
print(match_obj.group())
else:
print("匹配失败")
# <html><h1>www.itcast.cn</h1></html>
# \num 引用分组num匹配到的字符串
match_obj = re.match("<([a-zA-Z1-6]+)><([a-zA-Z1-6]+)>.*</\\2></\\1>", "<html><h1>www.itcast.cn</h1></html>")
if match_obj:
# 提示: group后面的括号里默认获取的是第0个分组数据,其实就是整个匹配到的数据
print(match_obj.group())
else:
print("匹配失败")
4. ?p
- ?P分组起别名
- (?P=name)调用别名为name分组匹配到的字符串
#需求:匹配出<html><h1>www.itcast.cn</h1></html>
#?p<name>取名 , ?p=name调用
match_obj = re.match("<(?P<name1>[a-zA-Z1-6]+)><(?P<name2>[a-zA-Z1-6]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
6.re模块的高级应用
- re.findall() 能够找出所有xxx字符串
- re.search() 能够匹配出包含xxx的字符串,一次
- re.sub() 将匹配到的数据进行替换
- re.split() 根据匹配进行切割字符串,并返回一个字符串列表
- re.match() 能够匹配出以xxx开头的字符串
1. re.search
需求:匹配出水果的个数
import re
# 根据正则表达式查找数据,提示:只查找一次
# 1.pattern: 正则表达式
# 2.string: 要匹配的字符串
match_obj = re.search("\d+", "水果有20个 其中苹果10个")
if match_obj:
# 获取匹配结果数据
print(match_obj.group())
else:
print("匹配失败")
运行结果: 20
2.findall
需求:匹配出多种水果的个数
import re
result = re.findall("\d+", "苹果10个 鸭梨5个 总共15个水果")
print(result)
运行结果: ['10', '5', '15']
3.sub
- sub
需求:将匹配到的评论数改成22
import re
# pattern: 正则表达式
# repl: 替换后的字符串
# string: 要匹配的字符串
# count=0 替换次数,默认全部替换 , count=1根据指定次数替换
result = re.sub("\d+", "22", "评论数:10 赞数:20", count=1)
print(result)
运行结果: 评论数:22 赞数:20
- re.search()
- 千万要注意,打印re.search结果的方式是group,和match一样
import re
my_str = """<img alt="醉玥儿的直播" data-original="https://rpic.douyucdn.cn/live-cover/appCovers/2018/06/18/3824021_20180618215700_big.jpg" src="https://rpic.douyucdn.cn/live-cover/appCovers/2018/06/18/3824021_20180618215700_big.jpg" width="283" height="163" class="JS_listthumb" style="display: block;">"""
img_url = re.search(r"https?.*?\.jpg",my_str)
if img_url:
result = img_url.group()
print(result)
需求:将匹配到的阅读数加1
import re
# match_obj:该参数系统自动传入
def add(match_obj):
# 获取匹配结果的数据
value = match_obj.group()
result = int(value) + 1
# 返回值必须是字符串类型
return str(result)
result = re.sub("\d+", add, "阅读数:10")
print(result)
运行结果: 阅读数:11
4.split 根据匹配进行切割字符串,并返回一个列表
需求:切割字符串"貂蝉,杨玉环:西施,王昭君"
import re
# 1. 正则
# 2. 要匹配的字符串
# maxsplit=1 分割次数, 默认全部分割
result = re.split(",|:", my_str, maxsplit=1)
print(result)
运行结果: ['貂蝉', '杨玉环:西施,王昭君']
7.贪婪和非贪婪
-
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪,使得?后面的内容不能由*或者-匹配。
>>> s="This is a number 234-235-22-423" >>> r=re.match(".+(\d+-\d+-\d+-\d+)",s) >>> r.group(1) '4-235-22-423' >>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s) >>> r.group(1) '234-235-22-423' >>> ``` ``` result = re.match("#.+?#","#幸福是奋#斗出来的#") # >>>>> 注意.+不能用[]括起来 if result: print("ok") print(result.group()) else: print("error") ``` 正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。 **解决方式:非贪婪操作符“?”,这个操作符可以用在"\*","+","?"的后面,这样?前面的正则表达式不能匹配?后面正则表达式的数据** ## 8. r 的作用 ``` ython中字符串前面加上 r 表示原生字符串,数据里面的反斜杠不需要进行转义,针对的只是反斜杠 Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。 建议: 如果使用使用正则表达式匹配数据可以** 都加上r **,要注意r针对的只是反斜杠起作用,不需要对其进行转义 ```
8.r的含义
比如
match_obj = re.match(r"<([a-zA-Z1-6]+)>.*</\1>", "<html>hh</html>")
Python中字符串前面加上 r 表示原生字符串(rawstring)
如果不使用r,默写情况下匹配时候需要加上反斜杠