python正则表达式基础

描述
正则表达式是用来简洁表达一组字符串的表达式
编译
将符合正则表达式语法的字符串转换成正则表达式特征
语法
正则表达式语法由字符和操作符构成
常用操作符:

操作符		说明							示例
.           表示任何单个字符  
[]          字符集,对单个字符给出取值范围    [ab]表示a、b,[a-z]表示a到z当字符
[^]         非字符集,对单个字符给出排除范围   [^ab]除了a、b之外任何单个字符
*           前一个字符0次或无限次扩展         ab*表示a、ab、abb等
+           前一个字符1次或无限次扩展
?           前一个字符0次或1次扩展
|           左右表达式任意一个              abc|bcd表示abc、bcd
{m}         扩展前一个字符m次               ab{2}c表示abbc
{m,n}       扩展前一个字符m至n次            ab{1,2}c表示 abc、abbc
^           匹配字符串开头                 ^ab表示匹配以ab开头的字符串
$           匹配字符串结尾
()          分组标记,内部只能使用|操作符   (abc)表示abc一个整体,(ab|cd)表示ab、cd
\d         数字,等价于[0-9]
\w         单词字符,等价于[A-Za-Z0-9]

正则表达式的表示类型
re库采用raw string(原生字符串类型)表示正则表达式,表示为:r’text’
例:

r'[1-9]\d{5}'
r'\d{3}-\d{8}|\d{4}-\d{7}'

Re库
Re库是python的标准库,主要用于字符串匹配
Re库主要功能函数:
re.search(pattern, string, flags=0)
在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
pattern:正则表达式
string:要匹配的字符串
flags:标志位,如:是否区分大小写、多行匹配等
标志位可选参数

import re
line="Cats are smarter than dogs"
s=re.search(r'(.*) are (.*?) .*',line)
print(s.groups()) # (.*)和(.*?) .*'
print(s.group()) # (.*) are (.*?) .*
print(s.group(1)) # (.*)
print(s.group(2)) # (.*?) .*

'''
结果:
('Cats', 'smarter')
Cats are smarter than dogs
Cats
smarter
'''

可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式

re.match(pattern, string, flags=0)
从一个字符串的开始位置起匹配正则表达式,返回match对象,如果不是起始位置匹配成功的话,match()就返回none。

import re
print(re.match('www', 'www.runoob.com'))  # 在起始位置开始匹配
print(re.match('com', 'www.runoob.com'))  # 不在起始位置开始匹配
'''
输出结果:
<re.Match object; span=(0, 3), match='www'>
None
'''

search()与match()的区别
match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而search 匹配整个字符串,直到找到一个匹配。
re.findall(string[, pos[, endpos]])
搜索字符串,以列表形式返回全部能匹配的子串
string 待匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

import re

pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)

print(result1)  # ['123', '456']
print(result2)  # ['88', '12']

re.split(pattern, string[, maxsplit=0, flags=0])
将一个字符串按照正则表达式匹配结果进行分隔,返回列表类型
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

import re
string="1-2-3-4-5-6"
arr1=re.split(r'-',string)
arr2=string.split('-')
print(arr1,arr2)
# ['1', '2', '3', '4', '5', '6'] ['1', '2', '3', '4', '5', '6']

re.filter(pattern, string, flags=0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代原生都是

import re 
it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group() )   # 12 32 43 3 

re.sub(pattern, repl, string, count=0, flags=0)
在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
pattern:必需参数,正则表达式
repl : 必需参数,替换的字符串,也可为一个函数
string :必需参数, 要被查找替换的原始字符串。
count :可选参数, 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 可选参数,编译时用的匹配模式,数字形式。

import re

data = '2020-4-10 #这是一个日期'
# 删除注释
num = re.sub(r'#.*$', "", data)
print(num)            # 2020-4-10
# 移除非数字的内容
num = re.sub(r'\D', "", data)
print(num)     # 2020410

compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

re.compile(pattern[, flags])
import re
pattern = re.compile(r'\d+')         # 用于匹配至少一个数字
m = pattern.match('one12twothree34four')     # 查找头部,没有匹配
# 等价于m=re.match(r'\d+','one12twothree34four')
print( m )

re库的另一种用法
字符串.函数,例如字符串中的split()函数以上其它函数也可以使用

match对象属性
.string 待匹配的文本
.re 匹配时使用的正则表达式
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

import re
m=re.search(r'\d+','one12twothree34four')
print("string:",m.string)
print("re:",m.re)
print("pos:",m.pos)
print("endpos:",m.endpos)

match对象的发方法
.group(0) 获取匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.end() 匹配字符串在原始字符串的结束位置
.span() 返回**(.start(),.end())**

import re
s = "dafda12332afd12"
r = re.search(r'\d+', s)
print("group(0):", r.group(0))
print("start():", r.start())
print("end():", r.end())
print("span():", r.span())

'''
group(0): 12332
start(): 5
end(): 10
span(): (5, 10)
'''

贪婪匹配
Re库默认采用贪婪匹配,即输出匹配最长的子串

import re
s = "pythonandjava"
print(re.search('py.*n', s).group(0))  # 结果是pythonan,而不是python

最小匹配操作符

*?       前一个字符0次或无限次扩展,最小匹配
+?       前一个字符1次或无限次扩展,最小匹配
??       前一个字符0次或1次扩展,最小匹配
{m,n}?   扩展前一个字符m至n次(含n),最小匹配

示例

import re
s = "pythonandjava"
print(re.search('py.*?n', s).group(0))  # python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无知的小菜鸡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值