正则表达式:
作用:给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
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}”后面加上?,使贪婪变成非贪婪