正则系列1: re.match用法

回顾:
什么是正则表达式:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些字符的特定组合,组合成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
我们的正则系列都用python来做练习,正则非python独有,python中re模块实现了正则。

re.match

re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match就返回none
该方法有3个参数,第一个就是你写的正则表达式,第二个匹配的目标字符串,第三个是一个匹配模式
re.match(pattern,string,flags=0)

  • 最常规的匹配
import re

content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content)
#^符号匹配字符串开头,Hello开头的字符串写过来,
#\s匹配任意的空白字符的,\d可以匹配任意的数字的
#后面有4567,写4个\d太麻烦了,d{4}
#\w匹配字母或者下划线
#后面一长串字符不想写了。直接用.来全部代替,匹配任意字符
#* 匹配0个或多个表达式
#也就是.*可以匹配任意的字符除了换行符
#用Demo$制定正则表达式的结尾
print(len(content))
print(result)
print(result.group())#返回匹配结果
print(result.span())#输出返回结果的范围

结果:
41
<_sre.SRE_Match object; span=(0, 41), match=‘Hello 123 4567 World_This is a Regex Demo’>
Hello 123 4567 World_This is a Regex Demo
(0, 41)

#这种也行
result1 =  re.match('Hello\s\d{3}\s\d+\s\w{10}.*Demo$',content)
print(result1.group())

结果:
Hello 123 4567 World_This is a Regex Demo

  • 泛匹配
#为了匹配方便,通常用.*来写我们的匹配方式
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$',content)
print(result.group())
print(result.span)

结果:
Hello 123 4567 World_This is a Regex Demo
<built-in method span of _sre.SRE_Match object at 0x0000027519F36370>

  • 获取匹配目标
    我们可以把目标括起来,指定左端点,右端点
#看下如何获取匹配目标,下面的字符串我们想获取1234567
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld.*Demo$',content)
print(result)
print(result.group())
print(result.group(1))#上面第一个d加了括号,把第一个括号里的内容取出来
print(result.span())
#如果正则表达式中出现了括号,那么第一个括号里面的内容是group(1),第二是group(2)

结果:
<_sre.SRE_Match object; span=(0, 40), match=‘Hello 1234567 World_This is a Regex Demo’>
Hello 1234567 World_This is a Regex Demo
1234567
(0, 40)

  • 贪婪匹配
import re

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$',content)
#开头直接不写全了,就^He后面直接.*
#我们的目标用括号括起来
print(result)
print(result.group(1))#打印结果不是1234567,而是7,也就是说.*会尽可能多的匹配,把123456都匹配进去了,\d+至少会有一个

结果:
<_sre.SRE_Match object; span=(0, 40), match=‘Hello 1234567 World_This is a Regex Demo’>
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))
#加个问号就是非贪婪匹配模式
#.*?就是尽可能少的匹配,后面一旦出现\d,它就会匹配数字

结果:
<_sre.SRE_Match object; span=(0, 40), match=‘Hello 1234567 World_This is a Regex Demo’>
1234567

  • 匹配模式
import re

content = '''Hello 1234567 World_This 
is a Regex Demo'''
# print(content)
# result = re.match('^He.*?(\d+).*?Demo$',content)
# print(result)#为什么打印出来none,是因为后面的.是不能匹配换行符的
result = re.match('^He.*?(\d+).*Demo$',content,re.S)
print(result)
print(result.group(1))

结果:
<_sre.SRE_Match object; span=(0, 41), match=‘Hello 1234567 World_This \nis a Regex Demo’>
1234567

  • 转义
import re

content = 'price is $5.00'#这个字符串里面有特殊字符,如何匹配,$和.
result = re.match('price is $5.00',content)
print(result)#打印匹配结果 匹配字符串中有特殊字符时候,正则表达式里写特殊字符是不行的。

结果:
None

#我们可以用反斜杠来代替
import re

content = 'price is $5.00'#这个字符串里面有特殊字符,如何匹配$和. 用反斜杠\去转义字符
result = re.match('(price is \$5\.00)',content)#加括号是为了得到匹配目标因为加了括号就可以用result.group()
print(result.group(1))

结果:
price is $5.00

总结:

尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,贪婪模式很可能使得我们匹配的目标少一些字符。 有换行符用re.S,因为html中有很多换行符。
缺点:这个match是要从头开始匹配,看下面的例子,就是说re.match中不是第一个字符开始,就不方便匹配

import re

content = 'price is $5.00'
result = re.match('rice is \$5\.00',content)
print(result)

None

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值