python 正则表达式

一、边界匹配

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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

repinkply

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值