正则表达式学习小结

常用语法表

语法描述
.匹配任何字符,除了换行符
\w匹配总目,数字及下划线
\W匹配不是字母,数字及下划线的字符
\s匹配任意空白字符,等价于[\t\n\r\f]
\S匹配任意非空字符
\d匹配任意数字,等价于[0-9]
\D匹配任意非数字的字符
\A匹配字符串开头
\b匹配·一个字边界, 即字与空格间的位置
\B非字边界匹配
\Z匹配字符串结尾,如果存在换行,只能匹配到换行前的结束字符串
\z匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
\v匹配一个垂直制表符
^匹配一行字符串的开头
$匹配一行字符串的结尾
[...]用来表示一组字符,单独列出,比如[dhb]匹配d、h或b
[^...]匹配不在[]中的字符,除X、X、X之外的
*匹配0个或多个表达式
+匹配一个或多个表达式
?匹配0个或1个前面的正则表达式定义的片段,非贪婪方式
{n}精准匹配n个前面的表达式
{n, m}匹配n到m次由前面正则表达式定义的片段,贪婪方式
| , a|b指明两项之间的一个选择,匹配a或b
()匹配括号内的表达式
  • 通用匹配
import re

content = 'hello 123 4576 world_This is a Regex Demo'
print(len(content))
# match()方法,第一个参数传入正则表达式,第二个参数传入要匹配的字符串
result = re.match('^hello.*Demo$',  content) # (.点)可以匹配任意字符(除换行符),*(星)代表匹配前面的字符无限次
print(result)
print(result.group())
# group()方法可以输出匹配到的内容
print(result.span())
# span()方法可以输出匹配的范围

"""
result = re.match('^hello\s(\d+)\sworld',  content) # ()把想要提取的字符括起来
print(froup(1)) # 输出第一个被()的匹配结果
"""
  • 贪婪与非贪婪
    .* 贪婪模式,匹配多的内容
    .*? 非贪婪模式。匹配较少的内容
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group(1))

# 贪婪匹配
# .*会匹配尽可能多的字符。正则表达式中.*后面是\d+,也就是至少一个数字,并没有指定具体多少个数字,
# .*就尽可能匹配多的字符,把123456 匹配了,给\d+留下一个可满足条件的数字7 ,最后得到的内容就只有数字7
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))

# 非贪婪匹配,尽可能匹配较少的字符
# 当.*?匹配到Hello 后面的空向字符时,再往后的字符就是数字了,而\d+恰好可以匹配,那么这里.*?的就不再进行匹配,交给\d+去匹配后面的数字
  • 修饰符
    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。
import re
content = '''Hello 1234567 World_This
  is a Regex Demo'''
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group(1))
# AttributeError: 'NoneType' object has no attribute 'group'
# 因为.匹配的是除换行符之外的任意字符,当遇到换行符时,.就不能匹配了

result = re.match('^He.*?(\d+).*Demo$', content, re.S)
# re.S修饰符的作用是使.匹配包括换行符在内的所有字符

修饰符


修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别匹配
re.M多行匹配,影响^和$
re.S使.匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符,影响\w,\W,\b和\B
re.X给予更灵活的格式使正则书写更易于理解、
  • 转义匹配
    如果目标字符串里面包含.的时候,需要用到转义匹配
import re

content = '(百度)www.baidu.com'
result = re.match('\(百度\)www\.baidu\.com', content)
print(result)
# 当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可
  • search()
    前面的match()方法是从字符串的开头开始匹配的,一旦开头不匹配,那么整个匹配就失败
    而search()方法,它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果
import re

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra strings'
result = re.search('Hello.*?(\d+).*?Demo', content)
print(result)
# html = '''<li data-view="4" class="active">
# <li data-view="4" class="active">
#     <a href="/3.mps" singer="齐秦">往事随风</a>
# </li>
# <li data-view="6"><a href="/4.mps" singer="beyond">光辉岁月</a></li>
# <li data-view="5"><a href="/5.mps" singer="陈慧琳">记事本</a></li>
# <li data-view="5">
#     <a href="/6.mps" singer="邓丽君">但愿人长久</a>
# </li>'''

import re
# 想获取singer属性值,需要写入singer=“(.*?)”,需要获取的用小括号包括住,文本的两侧边界是双引号
# 获取a标签内容,两侧边界是<与</a>,中间内容用(.*?)匹配
result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S)
if result:
    print(result.group(1), result.group(2))

  • findall()
    findall()方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。
import re

results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
    print(result)
    print(result[0], result[1], result[2])
  • 修改文本sub()方法
import re

content = '95ak47uz98kb23fu2d4h'
content = re.sub('\d+', '', content)
# 第一个参数传入要匹配的值,第二个参数为替换的字符串(去掉赋值为空),第三个参数为待解析的字符串
print(content)
# 方法比较
import re

results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
for result in results:
    print(result[1])
    
# 先用sub()方法将a 节点去掉,只留下文本,然后再利用findall()提取
html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
    print(result.strip())
  • compile()
    将正则字符串编译成正则表达式对象,以便重复使用
import re

content1 = '2019-1-28 20:00'
content2 = '2019-1-29 12:00'
content3 = '2019-1-30 21:20‘
# compile()类似封装的意思,还可以传入修饰符,方便调用
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值