re模块的玩法都在这里~~~ 1

简介: re模块的玩法都在这里~~~

想要使用python的正则表达式功能就需要调用re模块,re模块为高级字符串处理提供了正则表达式工具。模块中提供了不少有用的函数,比如:compile函数、match函数、search函数、findall函数、finditer函数、split函数、sub函数、subn函数等。接下来本文将会介绍这些函数的使用情况,然后通过分析编译流程对比两种re模块的调用方式,之后会介绍其他一些应用正则表达式需要知道的理论知识,最后通过一些经典的实例将之前学习的理论应用于实际。让我们开始正则表达式的学习之旅吧!!!

一、正则函数

re.match函数

功能:re.match尝试从字符串的起始位置匹配一个模式,如果匹配成功则返回一个匹配的对象,如果不是起始位置匹配成功的话,match就返回none。

语法:re.match(pattern,string,flags=0)

例子:

import re
s = '12abc345ab'
m = re.match(r'd+', s)
print(m.group())  # 12  match只能匹配一次,group()返回匹配的完整字符串
print(m.span())  # (0, 2)  span()返回起始、结束位置的元组,顾头不顾尾
m = re.match(r'd{3,}', s)
print(m)  # None {3,}规定了匹配最少3个字符,match从起始位置匹配,匹配不到3个字符,返回None

注:例子中涉及部分还未讲解的知识,若例子未看懂,可以将下面内容都看完后再回过头来看。

re.search函数

功能:re.search 扫描整个字符串并返回第一个成功的匹配,如果匹配成功re.search方法返回一个匹配的对象,否则返回None。

语法:re.search(pattern, string, flags=0)

例子:

import re
s = '12abc345ab'
m = re.search(r'd{3,}', s)  # search与match相比的优势,匹配了整个字符串,而match只从起始位置匹配
print(m.group())  # 345
print(m.span())  # (5, 8)
m = re.search(r'd+', s)  # search与match一样,只匹配一次
print(m.group())  # 12

re.sub函数

功能:re.sub用于替换字符串中的匹配项。

语法:re.sub(pattern, repl, string, count=0, flags=0)

repl参数可以是替换的字符串,也可以是一个函数。

  • 如果repl是字符串,那么就会去替换字符串匹配的子串,返回替换后的字符串;
  • 如果repl是函数,定义的函数只能有一个参数(匹配的对象),并返回替换后的字符串。

例子:

import re
phone = '2004-959-559  # 这是一个外国电话号码'
# 删除字符串中的Python注释
num = re.sub(r'#.*$', '', phone)  # .*表示匹配除了换行符之外的0个或多个字符,$表示匹配到字符末尾
print(num)  # 2004-959-559
# 删除非数字的字符串
num = re.sub(r'D', '', phone)  # D表示匹配非数字字符,相当于[^0-9]
print(num)  # 2004959559

count可指定替换次数,不指定时全部替换。例如:

import re
s = 'abc,123,ef'
s1 = re.sub(r'[a-z]+', '*', s)
print(s1)  # *,123,*
s2 = re.sub(r'[a-z]+', '*', s, count=1)
print(s2)  # *,123,ef

repl可以为一个函数。例如:

import re
# 调用函数对每一个字符进行替换,得到了不同的替换结果
def more(matched):
    print(matched.group())
    return '*' * len(matched.group())
s = 'abc,123,ef'
s1 = re.sub(r'[a-z]+', more, s)
print(s1)
"""
abc
ef
***,123,**
"""

re.subn函数

功能:和sub函数差不多,但是返回结果不同,返回一个元组"(新字符串,替换次数)"

例子:

import re
s = 'abc,123,ef'
s1 = re.subn(r'[a-z]+', '*', s)
print(s1)  # ('*,123,*', 2)
s2 = re.subn(r'[a-z]+', '*', s, count=1)
print(s2)  # ('*,123,ef', 1)

re.compile函数

功能:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。如果匹配成功则返回一个Match对象。

语法:re.compile(pattern[, flags])

注:compilte函数调用情况比较复杂,下面会有一节专门讲解。

re.findall函数

功能:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

语法:findall(string[, pos[, endpos]])

例子:

import re
s = '123abc345ab'
ms = re.findall(r'd+', s)  # findall匹配所有字符,而match和search只能匹配一次
print(ms)  # ['123', '345']
ms = re.findall(r'd{5}', s)  # {5}表示匹配5个字符,没有匹配到,返回空列表
print(ms)  # []

re.finditer函数

功能:在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

语法:re.finditer(pattern, string, flags=0)

例子:

import re
s = '12abc345ab'
for m in re.finditer(r'd+', s):
    print(m.group())

re.split函数

功能:split 方法用pattern做分隔符切分字符串,分割后返回列表。如果用’(pattern)’,那么分隔符也会返回。

语法:re.split(pattern, string[, maxsplit=0, flags=0])

例子:

import re
m = re.split(r'W+', 'dog,dog,dog.')  # W表示匹配非字母数字下划线
print(m)  # ['dog', 'dog', 'dog', '']
m = re.split(r'(W+)', 'dog,dog,dog.')  # 使用'(pattern)',连带分隔符一起返回
print(m)  # ['dog', ',', 'dog', ',', 'dog', '.', '']
m = re.split(r'W+', 'dog,dog,dog.', maxsplit=1)  # 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数
print(m)  # ['dog', 'dog,dog.']

小结

1 函数辨析:match和search的区别

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;

re.search 匹配整个字符串,直到找到一个匹配。

2 函数辨析:3个匹配函数match、search、findall

match 和 search 只匹配一次 ,匹配不到返回 None,findall 查找所有匹配结果。

3 函数返回值

函数re.finditer、re.match 和 re.search 返回匹配对象,而 findall、split 返回列表。

4 re.compile函数是个谜。

二、compile函数

re模块的使用一般有两种方式:

方法1:

直接使用上面介绍的 re.match, re.search 和 re.findall 等函数对文本进行匹配查找。

方法2:

(1)使用compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象;

(2)通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 Match 对象);

(3)最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作。

接下来重点介绍一下compile函数。

re.compile函数 用于编译正则表达式,生成一个Pattern对象,调用形式如下:

re.compile(pattern[, flag])

其中,pattern是一个字符串形式的正则表达式,flag是一个可选参数(下一节具体讲解)。

例子:

import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'd+')

利用Pattern对象可以调用前面提到的一系列函数进行文本匹配查找了,但是这些函数的调用与之前有一些小差别。

1. match函数

使用语法:

(1)re.match(pattern, string[, flags])

这个之前讲解过了。

(2)Pattern对象:match(string[, pos[, endpos]])

其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'd+')
m = pattern.match('one12twothree34four')  # 这种情况下和re.match一样
print(m)  # None
m = pattern.match('one12twothree34four', 3, 15)
print(m)  # 返回一个Match对象 <re.Match object; span=(3, 5), match='12'>

当匹配成功时会返回一个Match对象,其中:

  • group([0, 1, 2,…]): 可返回一个或多个分组匹配的字符串,若要返回匹配的全部字符串,可以使用group()或group(0)。
  • start(): 匹配的开始位置。
  • end(): 匹配的结束位置。
  • span(): 包含起始、结束位置的元组。等价于(start(), end())。
  • groups(): 返回分组信息。等价于(m.group(1), m.group(2))。
  • groupdict(): 返回命名分组信息。

import re

pattern = re.compile(r"([a-z]+) ([a-z]+)", re.I) # re.I表示忽略大小写,()表示一个分组

m = pattern.match(‘hello nice world’)

print(m.groups()) # (‘hello’, ‘nice’)

print(m.group(0)) # hello nice

print(m.span(0)) # (0, 10)

print(m.start(0)) # 0

print(m.end(0)) # 10

print(’----’)

print(m.group(1)) # hello

print(m.span(1)) # (0, 5)

print(m.start(1)) # 0

print(m.end(1)) # 5

print(’----’)

print(m.group(2)) # nice

print(m.span(2)) # (6, 10)

print(m.start(2)) # 6

print(m.end(2)) # 10

相关文章
|
JavaScript 前端开发 定位技术
|
3月前
|
Python
告别死记硬背:掌握Python正则表达式re模块的高效应用&[面向百度编程]
Python中正则表达式的高效应用,通过内置的`re`模块,讲解了如何匹配、提取和替换字符串,并提供了相关示例代码,同时提倡通过实践来掌握正则表达式的使用,而不是仅仅依赖网络搜索。
48 1
|
3月前
|
JSON 算法 API
京东以图搜图功能API接口调用算法源码python
京东图搜接口是一款强大工具,通过上传图片即可搜索京东平台上的商品。适合电商平台、比价应用及需商品识别服务的场景。使用前需了解接口功能并注册开发者账号获取Key和Secret;准备好图片的Base64编码和AppKey;生成安全签名后,利用HTTP客户端发送POST请求至接口URL;最后解析JSON响应数据以获取商品信息。
re模块的玩法都在这里~~~ 2
re模块的玩法都在这里~~~
49 0
|
6月前
|
计算机视觉 Python
怎么使用Python轻松打造淘宝主图视频生成神器
怎么使用Python轻松打造淘宝主图视频生成神器
123 0
|
6月前
|
算法 搜索推荐 调度
Python怎么实现贪婪排名算法
Python怎么实现贪婪排名算法
50 0
|
6月前
|
算法
泡泡龙游戏开发实战教程(5):核心查找匹配算法
泡泡龙游戏开发实战教程(5):核心查找匹配算法
158 0
编程小白的自学笔记四(正则表达式模块search函数)
编程小白的自学笔记四(正则表达式模块search函数)
|
JavaScript 定位技术 API
antdesign框架如何使用高德地图(搜索)
antdesign框架如何使用高德地图(搜索)
226 0
|
数据安全/隐私保护 C++ Python
深度之眼(十七)——Python标准库(上)
深度之眼(十七)——Python标准库(上)
143 0
深度之眼(十七)——Python标准库(上)