Python re模块

在Python中,通过内置的re模块提供对正则表达式的支持。

re模块中的方法

方法功能返回值
compile(pattern[, flags])根据包含正则表达式的字符串创建模式对象re对象
search(pattern, string[, flags])在字符串中查找第一个匹配到的对象或者None
match(pattern, string[, flags])在字符串的开始处匹配模式在字符串开头匹配到的对象或者None
split(pattern, string[, maxsplit=0,flags])根据模式的匹配项来分割字符串分割后的字符串列表
findall(pattern, string,flags)列出字符串中模式的所有匹配项所有匹配到的字符串列表
sub(pat,repl, string[,count=0,flags])将字符串中所有的pat的匹配项用repl替换完成替换后的新字符串
finditer(pattern, string,flags)将所有匹配到的项生成一个迭代器所有匹配到的字符串组合成的迭代器
subn(pat,repl, string[,count=0,flags])在替换字符串后,同时报告替换的次数完成替换后的新字符串及替换次数
escape(string)将字符串中所有特殊正则表达式字符串转义转义后的字符串
purge(pattern)清空正则表达式
template(pattern[,flags])编译一个匹配模板模式对象
fullmatch(pattern, string[, flags])match方法的全字符串匹配版本类似match的返回值

其中
pattern指的是匹配的正则表达式
string是要匹配的字符串。
maxsplit、count为次数
flags是标志位,用于控制正则表达式的匹配方式,包含下列标志

可选标志功能
re.I不区分大小写
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

r原生字符串

与大多数编程语言相同,正则表达式里使用\作为转义字符,但有时使用了太多的\会影响美观已经,并且麻烦,使用原生字符串的话,匹配一个数字的"\\d"可以直接写成r"\d"。

match方法

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
语法

import re


string = 'abc123'
rstr = re.match(r'abc', string)
print(rstr)
print(rstr.span())
# <re.Match object; span=(0, 3), match='abc'>
# (0,3)

其中m.span() 返回一个tuple表示(m.start(), m.end()) ,类似的还有
m.start() :返回起始位置,m.end()返回结束位置(不包含该位置的字符).
m.finditer():可以返回一个iterator,用来遍历所有找到的MatchObject.

我们还可以使用group() 或 groups() 匹配对象函数来获取匹配表达式。
group() 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups() 返回一个包含所有小组字符串的元组

groupdict() 返回获取模型中匹配到的分组中所有key的字典

import re
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0))   			# 123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1))   			# 123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2))   			# abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3))   			# 456
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups())   			# ('123', 'abc', '456')
print(re.search("([0-9]*)([a-z]*)(?P<num>[0-9]*)",a).groupdict())	# {'num': '456'}

search方法

re的search方法和match方法大致相同,差别就是re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

compile方法

compile方法用于将字符串形式的正则表达式编译为Pattern模式对象,可以实现更高效率的匹配。

import re
pat = re.compile(r"abc")
pat.match("abc123")
<_sre.SRE_Match object; span=(0, 3), match='abc'>

经过compile()方法编译过后的返回值是个re对象,它可以调用match()、search()、findall()等其他方法

findall方法

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
并且findall没有group方法

import re


obj = re.findall(r"abc","123abc456abc")
print(obj)
# ['abc', 'abc']

split方法

re模块的split()方法和字符串的split()方法很相似,都是利用特定的字符去分割字符串。但是re模块的split()可以使用正则表达式,因此会更加的灵活。

import re


s = "9+7*5+4/3"
lis = re.split(r"[\+\-\*\/]",s)
print(lis)
# ['9', '7', '5', '4', '3']

split有个参数maxsplit,可以用于指定分割的次数:

import re

s = "9+7*5+4/3"
lis = re.split(r"[\+\-\*\/]", s, maxsplit=2)
print(lis)
# ['9', '7', '5+4/3']

sub方法

sub()方法类似字符串的replace()方法,用指定的内容替换匹配到的字符,可以指定替换次数。

import re


shell = "djkfgjksff # 这是一串神秘代码"
# 删除字符串中的 Python注释 
new_s = re.sub(r'#.*$', "", shell)
print(new_s)
# djkfgjksff 

repl参数不仅仅可以是新的字符串,也可以是一个函数

import re


# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('num'))
    return str(value * 2)


s = 'ASD45DG4HG65'
print(re.sub('(?P<num>\d+)', double, s))
# ASD90DG8HG130
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值