python基础篇--day17

23 篇文章 0 订阅
21 篇文章 1 订阅

re模块

正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
很多语言中都有正则表达式的内容,当然python也不例外,python提供了re模块,来使用正则表达式。

首先说一下re里面的方法:

re.match(pattern, string, flags=0)
match从开始处进行匹配,成功返回re.Match对象,否则返回None。
re.search(pattern, string, flags=0)
search函数只返回第一个匹配到的结果,成功返回re.Match对象,否则返回None。
re.findall(pattern, string, flags=0)
按照规则匹配整个字符串,返回匹配结果的列表
re.sub(pattern, repl, string, count=0, flags=0)
sub按照给定的规则将string字符串中的相应的片段替换为repl,count 最多替换的次数,count=0默认为全部替换,返回替换后的字符串
re.split(pattern, string, maxsplit=0, flags=0)
通过给定规则,将string进行切割,maxsplit最多切割次数,maxsplit=0默认全部切割,返回

pattern是将要匹配的规则,string是被匹配的字符串

re里面的元字符:

字符功能
^字符串开始位置与匹配规则符合就匹配,否则不匹配匹配字符串开头。在多行模式中匹配每一行的开头
$匹配最后一行行尾
[a-z]匹配a-z的字符,^元字符如果写到字符集里就是反取
?匹配前边的子表达式0次或1次,等价于{0,1}
+匹配前边的子表达式1次或多次,等价于{1,}
*匹配前边的子表达式0次或多次,,等价于{0,}
|匹配多个条件,多个条件连接是用|隔开,相当于or
.除"\r""\n"外,匹配任意的单个字符,要使"."匹配换行符
{}{n}匹配n次,{n,}匹配至少n次,{m,n}匹配m-n次
\转义字符,\\匹配\

re里面的预定义字符:

字符功能
\b匹配一个单词边界,也就是指单词和空格间的位置,其它特殊字符也可以是单词的边界,如"#","$","&","*"等
\B匹配非单词边界
\d匹配一个数字字符。等价于[0-9]
\D匹配一个非数字字符。等价于[^0-9
\s匹配任何不可见字符,包括空格、制表符、换页符等,等价于[ \f\n\r\t\v]
\S匹配任何可见字符。等价于[^ \f\n\r\t\v]
\w匹配包括下划线的任何单词字符。这里的"单词"字符使用Unicode字符集,类似但不等价于“[A-Za-z0-9_]”,还包含汉字等它国字符
\W匹配任何非单词字符。这里的"单词"字符使用Unicode字符集,类似但不等价于“[^A-Za-z0-9_]”,还包含汉字等它国字符

re里面的模式:

字符功能
re.S(DOTALL)使.匹配包括换行在内的所有字符
re.I(IGNORECASE)使匹配对大小写不敏感
re.L(LOCALE)做本地化识别(locale-aware)匹配,法语等
re.M(MULTILINE)多行匹配,影响^和$
re.X(VERBOSE)该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

分组:
1.\number 引用number组内容
2.(?P< name>pattern) 使用名: (?P=name)

贪婪与非贪婪:
+* ? {m,n} greedy 贪婪 尽可能多的进行匹配
*? +? ?? {m,n}? non-greedy 非贪婪

'''
分组操作 () 表示的是一组  |  或者关系
分组命名匹配
  ()  + \number : \number 表示引用组匹配的内容

'''
import re

# Jack  Tom  Lucy  Linda  Steven  Daniel。。。  JOY
s = 'hi linda'
m_obj = re.search('(hi|hello) (Jack|Tom|Lucy|Linda)', s, re.I)  #
print(m_obj)
print(m_obj.group())
print(m_obj.group(1))
print(m_obj.group(2))

# 邮箱:126,163,qq  而且必须符合邮箱的格式 xxx@163.com   xxx的长度4-16位之间

# email = input('请输入邮箱:')
# m_obj = re.search(r'^(\w{4,16})@(126|163|qq).com$', email)
# if m_obj:
#     email_name = m_obj.group(1)
#     print(email_name + '符合邮箱格式')
# else:
#     print('不符合格式!')


# 1开头,不是以4、7结尾的手机号码(11位) 或者 010-34567897|0311-37647326
# tel = input('请输入号码:')
# m_obj = re.fullmatch(r'(1\d{9}[0-35689]|\d{3,4}-\d{8})', tel)
# print(m_obj)

# 标签:<a class="logo" target="_blank" href="/">
'''
<div class="breadcrumb">
<a target="_blank" class="album-name" href="/pic/%E5%8B%92%E5%B8%83%E6%9C%97%C2%B7%E8%A9%B9%E5%A7%86%E6%96%AF/1989503">勒布朗·詹姆斯图册</a>&nbsp;>&nbsp;<span class="album-desc">词条图片</span>
</div>

'''

s = '<div class="breadcrumb">詹姆斯</div>'

m = re.fullmatch(r'<(.+) class="breadcrumb">(.+)</\1>', s)  #
print(m)
print(m.group(2))

s = "<p class='breadcrumb'><a href='http://www.baidu.com'>詹姆斯 </a></p>"

m = re.fullmatch(r"<(.+) class='breadcrumb'><(.+) href='http://www.baidu.com'>.+</\2></\1>", s)
print(m.group())
print(m.group(1))
print(m.group(2))

# 命名的方式(?P<outer>)  (?P<inner>)
# http://image.baidu.com/star/page

m = re.fullmatch(
    r"<(?P<outer>.+) class='breadcrumb'><(?P<inner>.+) href='http://www.baidu.com'>.+</(?P=inner)></(?P=outer)>", s)

print(m.group())
print(m.group(1))
print(m.group(2))

# 贪婪与非贪婪:

s = 'abbbbbbbbbc'
m = re.match('ab+?', s)
print(m.group())

s = '<div>hello</div><div>world</div>'
m = re.match(r'<(?P<n>.+)>.+?</(?P=n)>', s)
print(m.group())


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只敲代码的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值