2.1、匹配目标
使用括号()将想要提取的字符串括起来。()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式依此对应每个分组,调用group方法传入分组的索引即可获得提取结果。
content = 'Hello 1234567 World\_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld',content)
print(result) # print(result.group()) # Hello 1234567 World print(result.group(1)) # 1234567 print(result.span()) # (0, 19) # 成功得到被括号括起来的1234567,group()会输出完整的匹配结果,而group(1)会输出第一个括号的匹配结果,同理,若还有括号,可group(2)、group(3)... 2.2、通用匹配 上述空白字符需要写\s匹配、数字\d匹配,量大。因此,万能匹配:.* 其中.可以匹配任意字符(除换行符),*代表匹配前面字符无数次。改写上述代码: content = 'Hello 123 4567 world\_This is a Regex Demo' result = re.match('^Hello.\*Demo$',content) print(result) # print(result.group()) # Hello 123 4567 world\_This is a Regex Demo print(result.span()) # (0, 41) 2.3、贪婪与非贪婪 贪婪匹配下、**.会匹配尽可能多的字符*。非贪婪匹配、.*?会匹配尽可能少的字符、但如果匹配的结果在字符串结尾,则可能匹配不到任何内容。 import re content = 'Hello 1234567 World\_This is a Regex Demo' result1 = re.match('^He.\*(\d+).\*Demo$',content) result2 = re.match('^He.\*?(\d+).\*Demo$',content) print(result1.group(1)) # 7 print(result2.group(1)) # 1234567 # 贪婪匹配下、.\*把123456都匹配了,只剩下7给\d+匹配。 # 非贪婪匹配下、.\*?把1234567交给\d+匹配。 2.4、修饰符 当遇到换行符时,.*?就不能匹配了。此时,加上修饰符re.S即可修正。 import re content = '''Hello 1234567 World\_This is a Regex Demo''' result = re.match('^He.\*?(\d+).\*?Demo$',content,re.S) print(result.group(1)) # 1234567 修饰符描述re.I使匹配对大小写不敏感re.L实现本地化识别(locale-aware)匹配re.M多行匹配,影响^和$re.S使匹配内容包括换行符在内的所有字符re.U根据Unicode字符集解析字符,这个标志会影响\w、\W、\b和\B\re.X该标志能够给予你更灵活的格式,以便将正则表达式书写的便于理解 2.5、转义匹配 当目标字符串中遇到用作正则匹配模式的特殊字符时,在 此字符前面加反斜杠\转义一下即可。 content = '(百度)www.baidu.com' result = re.match('\(百度\)www\.baidu\.com',content) print(result) # 2.6、search **search方法在匹配时会扫描整个字符串,然后返回第一个匹配成功的结果。**也就是说,正则表达式可以是字符串的一部分。在匹配时,search方法会依次以每个字符作为开头扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配的内容。 content = 'Extra stings Hello 1234567 World\_This s Regex Demo Extra stings' result = re.search('Hello.\*?(\d+).\*?Demo',content) print(result) # 1234567 2.7、findall findall方法能获取与正则表达式相匹配的所有字符串。其返回的结果是列表类型,需要通过遍历来依次获取每组内容。 # 上述代码改写 results = re.findall(' for result in results: # print(result) print(result[0],result[1],result[2]) #/2.mp3 任贤齐 沧海一声笑 #/3.mp3 齐泰 往事随风 #/4.mp3 beyond 光辉岁月 #/5.mp3 陈慧琳 记事本 #/6.mp3 邓丽君 但愿人长久 2.8、sub 除了使用正则表达式提取信息,还可借助来修改文本。 content = '54aK54yr5oiR54ix5L2g' content = re.sub('\d+','',content) print(content) # aKyroiRixLg # sub()方法中的第一个参数传入\d+匹配所有数字,第二个参数中传入把数字替换成的字符串,第三个参数是原字符串。 html = re.sub(' print(html) results = re.findall('
for result in results:
print(result.strip())
# 一路上有你
#沧海一声笑
#往事随风
#光辉岁月
#记事本
#但愿人长久
# sub方法处理后,a节点就没有了,然后findall方法直接提取即可。
2.9、compile
compile可以将正则表达式编译成正则表达式对象,以便在后面的匹配中复用。可以说compile方法是给正则表达式做了一层封装。
content1 = '2019-12-15 12:00'
content2 = '2019-12-17 12:55'
content3 = '2019-12-22 12:55'
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)
# 2019-12-15 2019-12-17 2019-12-22
四、httpx的使用*
有些网站强制使用HTTP/2.0协议访问,这时urllib和reequests是无法爬取数据的,因为它们只支持HTTP/1.1。
hyper和httpx是支持HTTP/2.0的请求库,requests已有的功能它几乎都支持。
1、示例*
url = 'https://spa16.scrape.center/'
response = requests.get(url)
print(response.text) # 报错,无法访问
2、安装
pip3 install "httpx[http2]"
3、基本使用
GET请求:
import httpx
client = httpx.Client(http2=True)
response = client.get('https://spa16.scrape.center')
print(response.text)
大多与requests相似
4.Client对象
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
参考链接
发表评论