正则表达式匹配规则简单使用

  • 匹配到的全是字符串,
  • 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)
    if match_obj:
        print(match_obj.group())
    #     print("%s是我想要的" % match_obj.group())
    # else:
    #     print("%s不是我要的" % value)

>>>
apple
pear

2. (ab)

需求:匹配出163、126、qq等邮箱
import re
match_obj = re.match("[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com", "hello@163.com")
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,默写情况下匹配时候需要加上反斜杠

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值