目录
一、python中的re模块
1.1 基本匹配和搜索
1.2 替换和分割
1.3 编译正则表达式
二、正则表达式对象
2.1 re.RegexObject 和 re.MatchObject
2.2 正则表达式修饰符 - 可选标志
2.3 正则表达式模式
2.4 正则表达式实例
一、python中的re模块
正则表达式是一种独特的字符序列,它能够协助你轻松地验证一个字符串是否符合特定的模式。
自Python 1.5版本以来,引入了re模块,该模块支持Perl风格的正则表达式模式。
re模块赋予了Python完整的正则表达式处理能力。
通过compile函数,可以根据一个模式字符串和可选的标志参数创建一个正则表达式对象。这个对象包含了一系列方法,用于进行正则表达式的匹配和替换操作。
此外,re模块还提供了与这些方法功能相同的函数,这些函数以一个模式字符串作为它们的第一个参数。本章节将重点介绍Python中常用的正则表达式处理函数。
1.1 基本匹配和搜索
Python中的正则表达式是通过`re`模块来实现的,这个模块提供了一系列函数和方法来处理字符串匹配和搜索。以下是一些常用的正则表达式功能和示例:
### 基本匹配和搜索
1. **匹配字符串**:使用`re.match()`函数检查字符串是否以特定模式开始。
2. **搜索字符串**:使用`re.search()`函数在字符串中查找第一个匹配的模式。
它们的语法规则类似:
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
3. **查找所有匹配**:使用`re.findall()`函数返回字符串中所有匹配的列表。
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
- string : 待匹配的字符串。
- pos : 可选参数,指定字符串的起始位置,默认为 0。
- endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
三者用法如下:
import re# 匹配字符串
result = re.match(r'Hello', 'Hello, world!')
print(result) # 输出: <re.Match object; span=(0, 5), match='Hello'># 搜索字符串
result = re.search(r'world', 'Hello, world!')
print(result) # 输出: <re.Match object; span=(7, 12), match='world'># 查找所有匹配
result = re.findall(r'\w+', 'Hello, world!')
print(result) # 输出: ['Hello', 'world']
4. finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。语法如下:
re.finditer(pattern, string, flags=0)
代码举例:
# -*- coding: UTF-8 -*-import reit = re.finditer(r"\d+","12a32bc43jf3")
for match in it: print (match.group() )
5. flags
参数
在Python的re
模块中,re.match()
函数和类似的正则表达式函数(如re.search()
、re.findall()
等)可以使用flags
参数来修改正则表达式的匹配行为。flags
参数可以是一个或多个标志的组合,这些标志通过按位或(|
)操作符组合在一起。以下是一些常用的flags
值:
1)re.IGNORECASE (re.I):
忽略大小写进行匹配。
2)re.MULTILINE (re.M):
多行模式,改变^和$的行为,使它们分别匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。
3)re.DOTALL (re.S):
使.特殊字符匹配包括换行符在内的所有字符。
4)re.UNICODE (re.U):
使\w、\W、\b、\B、\d、\D、\s、\S等字符类遵循Unicode字符属性数据库的规则。这个标志在Python 3中是默认行为,因为默认情况下字符串是Unicode的。
5)re.ASCII (re.A):
使\w、\W、\b、\B、\d、\D、\s、\S等字符类只匹配ASCII字符。
6)re.VERBOSE (re.X):
允许编写更具可读性的正则表达式,可以包含注释和空格,这些在匹配时会被忽略。
7)re.DEBUG:
显示有关编译表达式的调试信息。
这些标志可以组合使用,例如:
import repattern = r'hello'
string = 'Hello, hello, HELLO in the world!'# 使用忽略大小写标志
matches = re.findall(pattern, string, re.IGNORECASE)
print(matches) # 输出: ['Hello', 'hello', 'HELLO']
在这个例子中,re.IGNORECASE
标志被传递给re.findall()
函数,使得正则表达式模式'hello'
在匹配时忽略大小写,因此它能够匹配字符串中的所有大小写变体。
6. group函数
我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。
#!/usr/bin/python
import reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:print "matchObj.group() : ", matchObj.group()print "matchObj.group(1) : ", matchObj.group(1)print "matchObj.group(2) : ", matchObj.group(2)
else:print "No match!!"
以上实例执行结果如下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
1.2 替换和分割
1. **替换字符串**:使用`re.sub()`函数替换字符串中的匹配模式。
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
当`repl`参数是一个函数时,`re.sub()`函数会在每次匹配时调用这个函数,并将匹配对象作为参数传递给该函数。函数返回的值将作为替换字符串。以下是一个示例代码,展示了如何使用函数作为`repl`参数:
import redef replacer(match):# 获取匹配对象的组matched_text = match.group(0)# 对匹配的文本进行处理,例如转换为大写return matched_text.upper()# 定义正则表达式模式
pattern = r'\b\w+\b' # 匹配单词# 定义要处理的字符串
string = 'hello world, this is a test.'# 使用函数作为 repl 参数
result = re.sub(pattern, replacer, string, flags=re.IGNORECASE)print(result) # 输出: 'HELLO WORLD, THIS IS A TEST.'
在这个例子中,`replacer`函数接收一个匹配对象`match`,并返回匹配文本的大写版本。`re.sub()`函数在每次匹配时调用`replacer`函数,并用函数返回的值替换匹配的文本。`flags=re.IGNORECASE`标志使得匹配忽略大小写,因此所有的单词都会被转换为大写。
你可以根据需要自定义`replacer`函数,以实现不同的替换逻辑。
2. **分割字符串**:使用`re.split()`函数根据模式分割字符串。
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
import re# 替换字符串
result = re.sub(r'world', 'Python', 'Hello, world!')
print(result) # 输出: Hello, Python!# 分割字符串
result = re.split(r'\s+', 'Hello world')
print(result) # 输出: ['Hello', 'world']
1.3 编译正则表达式
为了提高效率,可以使用`re.compile()`函数将正则表达式编译成一个正则表达式对象,然后使用该对象的方法进行匹配和搜索。
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
参数:
-
pattern : 一个字符串形式的正则表达式
-
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
import re# 编译正则表达式
pattern = re.compile(r'\d+')# 使用编译后的对象进行匹配
result = pattern.findall('123 456 789')
print(result) # 输出: ['123', '456', '789']
### 常用正则表达式符号
- `.`:匹配任意单个字符(除了换行符)。
- `^`:匹配字符串的开头。
- `$`:匹配字符串的结尾。
- `*`:匹配前面的字符零次或多次。
- `+`:匹配前面的字符一次或多次。
- `?`:匹配前面的字符零次或一次。
- `\d`:匹配任意数字。
- `\w`:匹配任意字母、数字或下划线。
- `\s`:匹配任意空白字符。
这些符号可以组合使用,以构建复杂的正则表达式模式。
### 示例
import re# 匹配电子邮件地址
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
text = 'Contact us at support@example.com'
result = re.search(pattern, text)
print(result) # 输出: <re.Match object; span=(15, 31), match='support@example.com'>
通过这些功能和方法,Python的`re`模块提供了一个强大的工具集,用于处理和操作字符串中的模式匹配。
二、正则表达式对象
2.1 re.RegexObject 和 re.MatchObject
re.RegexObject
re.compile() 返回 RegexObject 对象。
re.MatchObject
group() 返回被 RE 匹配的字符串。
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
2.2 正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
2.3 正则表达式模式
正则表达式模式采用了特定的语法规则来定义匹配规则:
字母和数字在模式中直接表示其本身。在正则表达式模式中,字母和数字将匹配与其相同的字符。
当字母和数字前面加上一个反斜杠(\)时,它们通常会获得不同的含义,从而执行特殊的匹配功能。
标点符号除非经过转义处理,否则它们不会匹配其自身,而是执行特定的功能,表示某种特殊含义。
反斜杠本身是一个特殊字符,因此需要通过另一个反斜杠来进行转义。
鉴于正则表达式中频繁使用反斜杠,建议采用原始字符串(以 'r' 开头)来表示这些模式,以避免转义字符的混淆。例如,模式元素如 r'\t' 实际上等同于 '\\t',它们都匹配制表符。
以下表格概述了正则表达式模式语法中的特殊元素。若在定义模式时附加了可选的标志参数,某些特殊元素的行为可能会发生变化。