python里的正则

正则表达式:

作用:给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1.判断给定的字符串是否符合正则表达式的过滤逻辑(称作匹配)
2.可以通过正则表达式,从字符串中获取我们想要的特定部分

特点:
1.灵活性、逻辑性和功能性非常强;
2.可以迅速的用极简单的方式达到字符串的复杂控制
3.对于刚接触的人来说比较晦涩难懂

\A表示从字符串的开始处匹配
\Z表示从字符串的结束处匹配,如果存在换行,只匹配到换行前的结束字符串。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如,‘py\b’可以匹配’python’中的’py’,但不能匹配’openpyx1’里的’py’
\B匹配非单词边界。‘py\b’可以匹配’openpyx1’中的’py’,但不能匹配’python’里的’py’
\d digit匹配任意数字,等价于[0-9]
\D not digit匹配任意非数字字符,等价于[^\d].
\s space匹配任意空白字符,等价于[\t\n\r\f]
\S not space匹配任意非空白字符,等价于[^\s]
\w word匹配任意字符数字及下划线,等价于[a-zA-Z0-9]
\W not word匹配任意非字母数字及下划线,等价于[^\w]
\\匹配原义的反斜杠\
.用于匹配除换行符(\n)之外的所有字符
^用于匹配字符串的开始,即行首。
$用于匹配字符串的末尾(末尾如果有换行符\n,就匹配\n前面的那个字符),即行尾
*用于将前面的模式匹配0次或多次(贪婪模式,即尽可能多的匹配)
+用于将前面的模式匹配1次或多次(贪婪模式)
?用于将前面的模式匹配0次或1次(贪婪模式)
*?,+?,??即上面三种特殊字符的非贪婪模式(尽可能少的匹配)
{m}用于将前面的模式匹配m次
{m,}用于将前面的模式匹配m次或者多次,即最小匹配m次,最大匹配次数不限 >=m
{m,n}用于将前面的模式匹配m次到n次(贪婪模式),即最小匹配m次,最大匹配n次。
{m,n}?即上面’{m,n}'的非贪婪版本。
\:\是转义字符,在特殊字符前面加上\,特殊字符就失去了其代表的含义,比如+就仅仅代表+本身
[]用于标示一组字符,如果是第一个字符,则标示的是一个补集。比如[0-9]标示左右的数字,[0-9]标示除了数字外的字符
|比如A|B用于匹配A或B
(…)用于匹配括号中的模式,可以再字符串中检索或匹配我们所需要的内容。

re模块

在python中想要使用正则需要借助re模块

将要查找的正则规则传入re.compile()函数中,返回一个对象

pattern = re.compile(‘aaa’)

从msg的开头部分匹配正则,没有匹配到符合条件的内容时返回None值,匹配成功时返回一个match对象
<_sre.SRE_Match object; span=(0, 3), match=‘aaa’>

pattern.match(msg)

直接使用re模块用正则表达式来匹配字符:
match
从msg的开头部分匹配正则‘aaa’,没有匹配到符合条件的内容时返回None值,匹配成功时返回一个match对象

result = re.match(‘aaa’, msg)

search
进行正则字符串匹配方法,匹配的是整个字符串
search只要找到有匹配的 就不会再继续进行检索

result = re.search(‘aaa’, msg)

匹配整个字符串 找到一个继续向下找 一直找到字符串结尾

result = re.findall(‘aaa’, msg)

返回匹配到对象的位置(下标)

result.span()

提取匹配到的内容部分

result.group()

将字符串msg中的所有符合正则表达式的数字替换成90

re.sub(正则表达式,‘新内容’,string) 替换
result = re.sub(r’\d+’, ‘90’, msg)

可以通过定义一个函数来统一替换匹配的内容

def func(temp):  # temp:匹配成功后返回的结果
    num = temp.group()  # 通过group函数取出匹配的值
    num1 = int(num) + 1  # 将匹配的值统一+1
    return str(num1)  # 返出结果 用扔出去的值替换匹配的值

s = 'java:100,python:200'
result = re.sub(r'\d+', func, s)

split()
在字符串中搜索 如果遇到:或者,就分割,将分割的内容都保存到列表中

result = re.split(r’[,:]’, ‘java:100,python:200’)

正则中的或者符号:|

放在小括号里时是拿‘|’两边的部分当成一个整体来匹配
小括号还表示分组,group(1)表示提取第一组内容 ,group(2)表示提取第二组内容

(word|word|word)(aaa)(bbb)

放在中括号里是表示一个字符 而不是一个整体

[a|b]

结合number使用正则,每个小括号的内容为一组
\number 引用第number组的数据

msg = ‘<ab><abc>ccc<abc><ab>’
result = re.match(r’<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)<\2<\1>$’, msg)

分组时每组的名字可以自定义:
起名的方式 (?P<名字>正则) (?P=名字)

result = re.match(r’<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>’, msg)

正则中的贪婪与非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:
非贪婪则相反,总是尝试匹配尽可能少的字符。
在“*”,“?”,“+”,“{m,n}”后面加上?,使贪婪变成非贪婪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值