python ------ 正则表达式(找你所需要的)


正则表达式的作用:
测试字符串的某个模式,即数据有效性验证
实现按照某种规则替换文本
根据模式匹配从字符串中提取一个子字符串

正则表达式的构成:
原子(普通字符,如英文字符)
元字符(有特殊功用的字符)
以及模式修正字符
注意:一个正则表达式中至少包含一个原子

正则表达式测试工具介绍:RegexBuddy

匹配单个字符

在这里插入图片描述

匹配多个字符

在这里插入图片描述

匹配开头结尾

在这里插入图片描述

re模块操作

re.match(pattern,string,flags=0)
从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。
patter:正则模型
string:要匹配的字符串
flags:匹配模式

match()方法一旦匹配成功,就是一个match object对象,而match object 对象有以下方法:

  • group() 返回re匹配的字符串
  • start() 返回匹配开始的位置
  • end()返回匹配结束的位置
  • span() 返回一个元组包含匹配(开始,结束)的位置
# 导入模块
import re
# 通过match 方法,验证正则 re.match("正则表达式","要验证/检测的字符串")
#match()方法如果匹配成功,返回match object对象;如果匹配失败,返回None
result = re.match("\w{4,20}@163\.com$", "wenmei@163.com")
# 判断 验证是否成功
if result:
    print("匹配成功")
    # 如果成功,获取匹配的结果
    print("匹配结果:", result.group())
else:
    print("匹配失败")

匹配分组

“|” 匹配左右任意一个表达式
“()” 将括号中字符作为一个分组
分组整体匹配,result = re.match("\w{4,20}@(163|qq|126).com$", “wenmei@163.com”)
可以提取子字符串:

import re
result = re.match("(\d{3,4})-(\d{7,8})", "0349-1234567")
if result:
    print("匹配成功!")
    print("匹配结果:", result.group())
    print("提取区号:", result.group(1)) #第一个()中的内容
    print("提取电话号码:", result.group(2))#第二个()中的内容
else:
    print("匹配失败!")

“\num” 引用分组num匹配到的字符串,通俗理解就是引用前面一模一样的格式,格式刷,\1 引用第一组

import re
# result = re.match("<([a-zA-Z]*)>\w*</\\1>", "<html>hello</html>") # 第一个\是转义字符
result = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\\2></\\1>", "<html><h1>hello</h1></html>")

if result:
    print("匹配成功!")
    print("匹配结果:", result.group())
else:
    print("匹配失败!")

“ (?P< name>) (?P=name)” 分组起别名,并且引用别名为name分组匹配到的字符串

result = re.match("<(?P<name1>[a-zA-Z0-9]+)><(?P<name2>[a-zA-Z0-9]+)>.*</(?P=name2)></(?P=name1)>",
                  "<html><h1>hello</h1></html>")

re模块的⾼级⽤法

  • re模块的search方法
    re.search函数会在字符串内查找模式匹配,只要找到第⼀个匹配然后返回,如果字符串没有匹配,则返 回None。
    格式:re.search(pattern, string, flags=0)
    match()和search()的区别:
    match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配; 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话, match()就返回none。
print(re.match(super, ‘superstition’).span()) 会返回(0, 5)
print(re.match(super, ‘insuperable’)) 则返回None
print(re.search(super, ‘superstition’).span())返回(0, 5)
print(re.search(super, ‘insuperable’).span())返回(2, 7)
  • re模块的findall方法:查找所有,返回列表
    re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回⼀个列表。
result = re.findall("\\d+", "阅读次数:9999次,转发次数:883次,评论次数:3次")# 返回['9999', '883', '3']
  • re模块的sub方法:将匹配到的数据进行替换
    使⽤re替换string中每⼀个匹配的⼦串后返回替换后的字符串
    格式:re.sub(pattern, repl, string, count)-------》(“正则表达式”,“新的内容”,“要替换的字符串”)
ret = re.sub(r"\d+", "10000", "阅读次数:9999次,转发次数:883次,评论次数:3次") 
# 返回 阅读次数:10000次,转发次数:10000次,评论次数:10000次
  • re模块的split方法:根据匹配进⾏切割字符串,并返回⼀个列表
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
# 返回 ['info', 'xiaoZhang', '33', 'shandong']

python贪婪和非贪婪

贪婪:满足正则的情况下,尽可能多的取内容,默认为贪婪模式
非贪婪:满足正则的情况下,尽可能少的取内容
把贪婪模式改为非贪婪模式,需要使用符号 ?在"*","?","+","{m,n}"后⾯加上?,使贪婪变成⾮贪婪。

result = re.match(r"aaa(\d+)", "aaa123456") #输出aaa123456
result = re.match(r"aaa(\d+?)", "aaa123456") # 输出aaa1
===================将img标签中的图片url提取出来===========================
import re
str1 = """
<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">
"""
result = re.search('src=\"(.*?)\"', str1)
if result:
    print("匹配成功")
    print("匹配结果:", result.group())
    print("url地址:", result.group(1))
else:
    print("匹配失败")
#匹配成功
#匹配结果: src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg"
#url地址: https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg

r的作⽤

Python中在正则字符串前⾯加上 ‘r‘ 表示, 让正则中的 ‘’ *不再具有转义功能(默认为转义),就是表示原⽣字含义⼀个斜杠 *

result = re.match(r"<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\2></\1>", "<html><h1>hello</h1></html>")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值