回顾:
什么是正则表达式:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些字符的特定组合,组合成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
我们的正则系列都用python来做练习,正则非python独有,python中re模块实现了正则。
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
#看下如何获取匹配目标,下面的字符串我们想获取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