入门有趣的正则表达式呢

常用正则表达式

. 代表任意字符,除换行符
() 代表分组表达式,作为整体出现
按所有空白字符来切割:\s([\t\n\r\f\v])\S(任意非空白字符[^\t\n\r\f\v])
用数轴的方式表示 .*? 的联系。实心点代表包括该点

在这里插入图片描述

1–search() 对匹配分组重命名

利用(?P<groupname regex表达式>)进行分组命名,不能用小写p

import re
mystr=r'wee123/lily'
ret=re.search('(?P<id>\d{3})/(?P<name>\w{4})',mystr)
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))

# out
123/lily
123
lily

2–贪婪,非贪婪双胞胎

我很贪婪

pattern='wee.*'  # pattern='wee.+' is also OK
ret=re.search(pattern,mystr)
print(ret)  # <_sre.SRE_Match object; span=(0, 11), match='wee123/lily'>

我不贪婪

pattern='wee.+?'  # OR .?
ret=re.search(pattern,mystr)
print(ret)  # <_sre.SRE_Match object; span=(0, 4), match='wee1'>

3-- +和分组

p2=r'(\w)+'  # + 默认匹配前面的字符无限次,如果把括号去掉,则匹配http
print(re.findall(p2,'http'))
p2=r'.?+'  # + 默认匹配前面的字符无限次,如果把括号去掉,则匹配http
print(re.findall(p2,'http'))  # re.error: multiple repeat at position 2,因为量词重叠导致的错误,详细解释请看下面的链接

python-regex-multiple-repeat-error

4–如何让re.S无法分组匹配,^ 有办法

pattern=’^ regex’ 的意思
在这里插入图片描述

5–[ ]看我灭了特殊字符的能力,特殊字符来我’ '麾下

#wave_1
# pattern为空格,逗号和任意字符pattern=' |,|.' 三者是或关系,无法完全匹配整体‘ ,a’

#wave_2
# 匹配空格逗号和点,没有中间的|也可以,其中点代表要匹配点. ,而不是任意字符,即特殊字符. 失去了代表任意字符的超能力
pattern='[ |,|.]'  

6–为啥多出一个空字符串?? 好奇宝宝NOTACK

mystr='love never,felt so good'
pattern=' |,|.'  # 匹配空格逗号和点,没有中间的|也可以,其中点代表要匹配点. ,而不是任意字符
temp=re.findall(pattern,mystr)  #[' ', ' ', ' ', ' ']
print(len(temp))# 23
print(temp) 
silly=re.split(pattern,mystr)
print(len(silly))  # 为啥会多出一个空字符串?????# 24
print(silly)  
>>> import re
>>> re.findall('a?', 'aaaa')
['a', 'a', 'a', 'a', '']

6.5-----re/str.split()

python字符串切割:str.split()和re.split()对比

# str.split不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。
>>> s1="aa bb  cc"  # bb和cc中间两个空格
>>> s1.split(' ')  # 一个空格
['aa', 'bb', '', 'cc']
s=' from   the ashes   a fire shall  be woken '  # 首尾n个空白 分割后仍有n个空格,其他位置都是n-1 个空格
print(s.split(' '))

# ['', 'from', '', '', 'the', 'ashes', '', '', 'a', 'fire', 'shall', '', 'be', 'woken','']

' '.split(' ')    # ['', ''],只有空白字符时分割成两个空格

'a1aa2aa3'.split('a')
['', '1', '', '2', '', '3']
# "abc aa;bb,cc | dd(xx).xxx 12.12'    xxxx"
使用括号捕获分组的适合,默认保留分割符
re.split('([;])',line)
['abc aa', ';', "bb,cc | dd(xx).xxx 12.12'\txxxx"]
去掉分隔符,加?:
>>> re.split(r'(?:;)',line)
['abc aa', "bb,cc | dd(xx).xxx 12.12'\txxxx"]

7 --re.S的作用

在这里插入图片描述

8–{m} 匹配前面的字符m次

import re
mystr=1 2 3 4 5’
pattern=re.compile(r’ (\d\s){2})  # 正则pattern之前还有空格
result=re.findall(pattern,mystr)
print(result) #['2 ', '4 ']

# 为啥3 没有被选上,因为2 占用了3前面的空格

9–匹配豆瓣书籍的正则(实例)

import requests
import re

#   Fist Part
header = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
}
content = requests.get('https://book.douban.com/', headers=header)
print(content)
with open('1.html', 'w', encoding='utf-8') as file:
    file.write(content.text)

#   second part
with open('1.html', 'r', encoding='utf-8') as file:
    pattern = re.compile('<li.*?cover">.*?<a href="(.*?)"',
                         re.S)  # 匹配书籍链接with open('1.html','r',encoding='utf-8') as file:
    results = re.findall(pattern, file.read())
    print(results)

10–a?的奇妙–NOTACK

findall(pattern, string, flags=0)
对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。
如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。
`空匹配也会包含在结果里`。

在 3.7 版更改: 非空匹配现在可以在前一个空匹配之后出现了。

re.findall('a?','aac') 
['a', 'a', '', ''] 

re.findall('a?','a') 
['a',  ''] 
---------------
re.findall('aa?','aac') 
['aa'] 

10–re.sub

调用re.sub时 必须用关键词参数传入flags=re.I , 位置传参不行,无法正常替换

11–匹配日期

验证日期的正则表达式

未使用非捕获组的正则:
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

使用非捕获组的正则:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

匹配HH:mm:ss格式时间
正则表达式:([01][0-9]|2[0-3]) (:[0-5][0-9]){2}

匹配0100的数字
正则表达式:^([1-9]?[0-9]|100)$

12–findall 和 | 擦出怎样的火花

# 当使用| 运算符连接两个pattern时,当第一个带有表示分组的括号,第n个的pattern不带分组括号,默认不提取第n个pattern的任何数据
res=re.findall('[^i](pp)|到付',mystr)  
# res:['pp','']

13–快速转换成pdf格式

doc_format_list = [r'.docx$', r'.doc$', r'.rtf$']
doc_format_pattern = '|'.join(doc_format_list)
pdf_path = re.sub(doc_format_pattern, '.pdf', path, flags=re.I)  # 利用正则快速替换大小写的word 文档,re.I 必须通过关键字传参


巨人的肩膀

正则表达式之捕获组和非捕获组

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值