(Python)正则表达式(三)

前言

昨天学习了@白月黑羽up主所出的正则表达式视频课程的一部分,计划三天学完,今天是第三天,看来只能明天结尾了。

学习记录

正则表达式入门依旧是看小甲鱼的文档和白月黑羽up主的视频

元字符^

^匹配字符串(文本)的起始位置

  • 如果是单行模式,表示匹配整个文本的开头位置
  • 如果是多行模式,表示匹配文本每行的开头位置

题目:下面文本中,每行最前面的数字表示水果编号,最后的数字表示价格,要提取所有水果编号

001-苹果价格-60,
002-橙子价格-70,
003-香蕉价格-80,

代码实现

content = '''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80
'''

import re
p = re.compile(r'^\d+',re.M)
for one in p.findall(content):
    print(one)

运行结果如下

001
002
003

如果改为默认模式(单行模式),也就是去掉 compile 的第二个参数 re.M,运行结果如下

001

元字符$

$匹配字符串(文本)的结束位置

  • 如果是单行模式,表示匹配整个文本的结束位置
  • 如果是多行模式,表示匹配文本每行的结束位置

题目:下面文本中,每行最前面的数字表示水果编号,最后的数字表示价格,要提取所有价格

001-苹果价格-60,
002-橙子价格-70,
003-香蕉价格-80,

代码实现

content = '''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80
'''

import re
p = re.compile(r'\d+$',re.M)
for one in p.findall(content):
    print(one)

运行结果如下

60
70
80

如果改为默认模式(单行模式),也就是去掉 compile 的第二个参数 re.MULTILINE,运行结果如下

80

联系昨天所学的编译标志及贪婪模式和非贪婪模式,可以小结出Python通过编译标志来控制正则表达式字符串的模式

元字符()

()称之为 正则表达式的 组选择

  • 就是把正则表达式匹配的内容里面 其中的某些部分 标记位某个组,正则表达式可以标记多个组
  • 之所以要有组的概念,是因为往往需要提取已经匹配的 内容里面的 某些部分的核心

题目:从下面文本中选择每行逗号前的字符串

苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的

正则表达式字符串:^(.*),

验证如下

在这里插入图片描述
代码实现

content = '''苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的'''

import re
p = re.compile(r'^(.*),', re.MULTILINE)
for one in  p.findall(content):
    print(one)

划分多个组

题目:从下面文本中,提取出每个人的 名字 和 对应的 手机号

张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901

思路:先将文本部分表达,然后各部分融合起来表达整体,再用括号括起要匹配的内容

用代码实现

content = '''张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901'''

import re
p = re.compile(r'^(.+),.+(\d{11})', re.MULTILINE)
for one in  p.findall(content):
    print(one)

运行结果如下

('张三', '15945678901')
('李四', '13945677701')
('王二', '13845666901')

当有多个分组的时候,可以使用 (?P<分组名>…) 这样的格式,给每个分组命名

这样做的好处是,方便后续代码提取每个分组里面的内容

代码实现

content = '''张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901'''

import re
p = re.compile(r'^(?P<name>.+),.+(?P<phone>\d{11})', re.MULTILINE)
for match in  p.finditer(content):
    print(match.group('name'))
    print(match.group('phone'))

解读

  • group() 返回匹配的字符串
  • finditer() 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回

元字符?

?用于指定前一个字符匹配零次或者一次

题目:从下面文本里面抓取所有职位的薪资

Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人

代码实现如下

content = '''Python3 高级开发工程师 上海互教教育科技有限公司上海-浦东新区2万/月02-18满员
测试开发工程师(C++/python) 上海墨鹍数码科技有限公司上海-浦东新区2.5万/每月02-18未满员
Python3 开发工程师 上海德拓信息技术股份有限公司上海-徐汇区1.3万/每月02-18剩余11人
测试开发工程师(Python) 赫里普(上海)信息科技有限公司上海-浦东新区1.1万/每月02-18剩余5人
'''

import re
p = re.compile(r'[\d.]+万/每?月',re.M)
for one in p.findall(content):
    print(one)

解读
[\d.]+:表示匹配 数字或者点多次出现的情况 如:3 33.33这样的数字
每?月这部分表示匹配每月中每这个字可以出现0次或者1次

小结

今天的学习任务大部分没有完成,时间主要花在了微信公众号上,除此看了场篮球比赛,可惜输了,正则表达式还没有学完,明天继续,并且上强度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值