一、边界匹配
import re
string = '123456789'
result = re.findall('\d{4,8}',string)
print(result) # 输出['12345678']
在匹配项最前面加上^,最后面加上$,则为边界匹配。此时会匹配完整的字符串,不会像上面那一种情况,匹配到一部分就输出。
这里的^ 和 $ 的意义分别代表:
^ :从字符串开始的位置进行匹配。
$ :从字符串结束的位置进行匹配
import re
string = '123456789'
result = re.findall('^\d{4,8}$',string)
print(result) #输出[]
demo (理解^ 和 $):
import re
string = '100000001'
result = re.findall('000',string)
print(result)
#会输出 ['000', '000']
import re
string = '100000001'
result = re.findall('^000',string)
print(result)
#此时会输出[],为什么会输出这个结果呢?
#因为,字符串开始字符为1,不是0,所以根本匹配不到
import re
string = '100000001'
result = re.findall('000$',string)
print(result)
#同理,这样也会输出[],也会匹配不到任何集合
二、sub、seaech、match
def sub(pattern: Pattern[AnyStr],
repl: (Match[AnyStr]) -> AnyStr,
string: AnyStr,
count: int = ...,
flags: int | RegexFlag = ...) -> AnyStr
参数 count 默认为0,代表全部匹配。
count =1 :代表只匹配到第一个
count =2 :代表匹配前2个,
count=3 : 代表匹配前3个
import re
string = 'Pythonc#JavaC#PHPC#'
result = re.sub('c#','Go',string,2,re.I)
print(result)
import re
string = 'Pythonc#JavaC#PHPC#'
result = re.sub('c#','Go',string,2,re.I)
print(result)
lanuage = string.replace('c#','Go')
print(lanuage)
sub 强大的地方在于,其第二个参数,repl: (Match[AnyStr]) -> AnyStr 可以是函数。
可以定制化进行字符串替换操作。
import re
string = 'Pythonc#JavaC#PHPC#'
def convert(value):
print(value)
matched = value.group()
print(matched)
return '!!' + matched + '!!' # 这样写,实现功能更灵活
result = re.sub('c#',convert,string,0,re.I)
print(result)
demo:把函数作为参数传递
需要:将字符串 string = 'ABC3721D86',中的数字,大于6,替换为9,小于6的替换为0。
import re
string = 'ABC3721D86'
def convert(value):
matched = value.group()
if matched >= '6':
return '9'
else:
return '0'
result = re.sub('\d',convert,string)
print(result)
re.findall 、re.match、re.search 的区别
1.re.match(...) 从字符串第一个字符开始匹配,如果第一个字符没有匹配到,则返回None。
2.re.search(...) 是从前往后搜索整个字符串,一旦找到对应的匹配字符,就立即返回对应的匹配字符。
3.re.match(...) 和 re.search(...) 返回是一个对象,而 re.findall(...)返回的是一个列表。
4.re.match(...) 和 re.search(...) 返回是一个对象,用group()方法,得到匹配的字符串,span()得到匹配字符串在源字符串起始的位置。
5.re.match(...) 和 re.search(...) 是非贪婪匹配,一旦匹配成功,就会立马返回结果;而re.findall(...)是贪婪匹配,会匹配所有的结果。
import re
string = 'A83C72D1D8E67'
result = re.match('\d',string)
print(result) #None
result = re.search('\d',string)
print(result)
print(result.group())
print(result.span())
三、group 分组
需求:提取出 string = 'life is short,i use python',string中的 is short,i use
goup(0) 是正则表达式完整匹配的结果。如果想得到中间的匹配的结果,则需要从1开始。即为:group(1),group(2)等等。
demo1:
import re
string = 'life is short,i use python'
result = re.search('(life)(.*)(python)',string)
print(result.group(2).strip())
demo2 写法和 demo1 写法等价。
import re
string = 'life is short,i use python'
result = re.search('life(.*)python',string)
print(result.group(1).strip())
当然,如果改为re.findall(...) 的写法,则代码如下所示:
import re
string = 'life is short,i use python'
result = re.findall('life(.*)python',string)
print(result)
分组也可以有多个,demo 代码如下:
需要:在上面一个需要的前提下,string = 'life is short,i use python,i love python',还要找出字符串string后面2个python 中间的内容,即:is short,i use ,i love
import re
string = 'life is short,i use python,i love python'
result = re.findall('life(.*)python(.*)python',string)
print(result)
print(result[0])
print(result[0][0])
print(result[0][1])
import re
string = 'life is short,i use python,i love python'
result = re.search('life(.*)python(.*)python',string)
print(result)
print(result.group(0,1,2))
print(result.group(0))
print(result.group(1))
print(result.group(2))
#groups() 返回所有的匹配结果,放在一个元组中
print(result.groups())