RE使用的大概步骤
- 使用compile将表示正则的字符串编译为pattern对象
- 通过pattern对象提供一系列方法对文本进行查找匹配,获得匹配结果,一个match对象
- 最后使用match对象提供的的属性和方法获得信息,根据需要进行操作
RE常用函数
- group() 获得一个或者多个匹配的字符串,当获得整个匹配的子串时,直接使用group获得group(0)
- start:获得分组匹配的子串在整个字符串中的起始位置,参数默认为0
- end:获得分组匹配的子串在整个字符串中的结束位置,参数默认为0
- span:返回的结构技术(start(group),end(group))
#导入相关包
import re
#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')
#在字符串“onetwothree123fourfivesix45678”查找
#返回结果“none"表示没找到,否则返回匹配jieguo
m = p.match("one123twothree123fourfivesix45678",3,20)
#m = re.findall(r"\d+","onetwothree123fourfivesix45678")
#m = p.match("onetwothree123fourfivesix45678")
print(m)
输出:
<re.Match object; span=(3, 6), match=‘123’>
string = '刘德华 Andy Lau'
pattern = '.*?\s'
s = re.match(pattern=pattern,string=string)
print(s.group())
输出:
刘德华
RE compile 和match函数
- compile
- match :从序号0开始查找匹配的字符,如果不匹配,即使后面有匹配的内容,仍然返回NONE
#导入相关包
import re
#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')
#在字符串“onetwothree123fourfivesix45678”查找
#返回结果“none"表示没找到,否则返回匹配jieguo
m = p.match("onetwothree123fourfivesix45678",3,15)
print(m)
# match可以输入参数,表示起始位置和终结位置
# match只能有一个,返回查找到的第一个内容
m = p.match("onetwothree123fourfivesix45678",11)
help(p.match)
输出:
None
Help on built-in function match:
match(string, pos=0, endpos=9223372036854775807) method of re.Pattern instance
Matches zero or more characters at the beginning of the string.
print(m[0])
print(m.start(0))#查找到的对象起始下标序号
print(m.end(0))#查找到的对象结束下标序号
输出:
123
11
14
import re
#re.I表示忽略掉大小写
p = re.compile(r'([a-z]+) ([a-z]+)',re.I)
m = p.match('I really love wang xiao jing')
print(m)
输出:
<re.Match object; span=(0, 8), match=‘I really’>
print(m.group(0))#表示返回结果
print(m.group(1))#表示第一个匹配项
print(m.group(2))#表示第二个匹配项
print(m.group(3))#该项没有,返回no such group
输出
I really
I
really
IndexError Traceback (most recent call last)
in
4 print(m.group(2))#表示第二个匹配项
5
----> 6 print(m.group(3))#该项没有,返回no such group
IndexError: no such group
#表示 group 0 的起始序号和结束序号
print(m.start(0))
print(m.end(0))
print('*'*20)
#表示 group 1 的起始序号和结束序号
print(m.start(1))
print(m.end(1))
print('*'*20)
#表示 group 2 的起始序号和结束序号
print(m.start(2))
print(m.end(2))
输出
0
8
0
1
2
8
print(m.group())#返回group(0)的结果
print('*'*30)
print(m.groups())#返回全部的group结果
输出
print(m.group())#返回group(0)的结果
print(’*’*30)
print(m.groups())#返回全部的group结果
查找
- search(str,[pos,[endpos]]):在字符串查找匹配,pos和endpos表示起始位置和结束位置
- findall:查找所有
- finditer:查找,返回一个可iter的结果
#导入相关包
import re
#查找数字
#r表示字符串不转义
p = re.compile(r'\d+')
#返回结果“none"表示没找到,否则返回匹配jieguo
m = p.search("one123twothree123fourfivesix45678")
print(m.group())
输出
123
rst = p.findall("one123twothree123fourfivesix45678")
print(type(rst))
print(rst)
输出
<class ‘list’>
[‘123’, ‘123’, ‘45678’]
SUB替换
- sub(repr,str[,count])
#sub 替换案例
p = re.compile(r'(\w+) (\w+)')
s = "hel 123 i 12 a b c d 123"
rst = p.sub('hello world',s)
print(rst)
输出
hello world hello world hello world hello world 123
匹配中文
- 大部分中文表示范围:[u4e00-u9fa5],不包括全角标点
import re
title = u'世a 界 您好 a bcsd'
p = re.compile(r'[\u4e00-\u9fa5]+')
rst = p.findall(title)
print(rst)
输出
[‘世’, ‘界’, ‘您好’]
贪婪和非贪婪
- 贪婪表示尽可能多的匹配,使用(*)表示
- 非贪婪表示找到符合条件的内容即可,使用(?)表示
- 正则默认是贪婪的
import re
title = u'<div>name</div> <div>age</div>'
p1 = re.compile(r'<div>.*</div>')
p2 = re.compile(r'<div>.*?</div>')
rst1 = p1.search(title)
rst2 = p2.search(title)
print(rst1)
print(rst2)
print('*'*80)
print(rst1.group(0))
print(rst2.group(0))
输出
<re.Match object; span=(0, 30), match= ‘
<re.Match object; span=(0, 15), match=‘