1、re模块介绍
Python 模块 re 是一个用于处理正则表达式的标准库,提供了一些函数用来匹配、查找、替换字符串中的文本。
re 模块中经常使用的函数有:
-
re.search(pattern, string, flags=0)
:扫描整个字符串查找匹配正则表达式的位置,返回一个 match 对象,如果不匹配返回 None。 -
re.match(pattern, string, flags=0)
:尝试从字符串的开头匹配正则表达式,返回一个 match 对象,如果不匹配返回 None。 -
re.findall(pattern, string, flags=0)
:在字符串中查找所有匹配正则表达式的字符串,并以列表形式返回。 -
re.sub(pattern, repl, string, count=0, flags=0)
:使用 repl 替换在给定字符串中匹配 pattern 的所有字符串,返回替换后的字符串,如果指定了 count,则只替换前 count 个匹配的字符串。 -
re.compile(pattern, flags=0)
:将正则表达式编译成一个 Pattern 对象,可以重复调用该对象的多个方法,避免了对同一个正则表达式反复解析。
re 模块中还有很多其它方法,详细信息请查阅Python 官方文档。
2、re.search方法
re.search()
是 Python re 模块中用于扫描整个字符串查找匹配正则表达式的位置,返回一个 match 对象,如果不匹配返回 None。
其语法如下:
re.search(pattern, string, flags=0)
下面对这个函数的三个参数进行说明:
pattern
: 匹配模式,定义需要查找的字符串的规则。可以是一个普通字符串也可以是一个正则表达式。string
: 需要被查找的字符串。flags
: 可选参数,用于控制正则表达式匹配时的各种标志和选项。常用的标志包括:re.A
或re.ASCII
:启用 ASCII 字符集,这是默认设置。re.I
或re.IGNORECASE
:忽略大小写,在进行搜索时不区分大小写。re.M
或re.MULTILINE
:多行模式,使元字符^
、$
可以匹配每一行的开头和结尾,而不仅是字符串的开始和结束位置。re.S
或re.DOTALL
:点任意匹配模式,使通配符.
匹配包括换行符在内的所有字符。re.L
或re.LOCALE
:本地化模式,使用特定于系统的本地语言环境规则,但这种模式已经被弃用。re.U
或re.UNICODE
:启用 Unicode 字符集,支持 Unicode 属性,如\w
,\W
(Unicode 单词字符和非单词字符)等。re.X
或re.VERBOSE
:详细模式,允许在正则表达式中添加注释,忽略空格和换行符。
示例如下:
import re
# 使用 re.search() 匹配字符串
string = "abc def ghi"
match = re.search(r'abc', string)
if match:
print('匹配成功!')
print('math = ', match)
print('匹配到的字符串:', match.group())
else:
print('匹配失败。')
执行结果:
匹配成功!
math = <re.Match object; span=(0, 3), match='abc'>
使用 `re.search()` 函数在字符串中查找第一个匹配项并返回一个 `match` 对象。
3、match对象
在使用 Python re 模块进行正则表达式匹配时,当匹配成功时会返回一个 `match` 对象。这个对象可以获取到模式匹配的详细信息,如匹配到的字符串、匹配位置等。
`match` 对象拥有以下常用的属性和方法:
- - `group()`:返回被匹配到的字符串。
- - `start()`:返回匹配的起始位置。
- - `end()`:返回匹配的结束位置。
- - `span()`:返回一个元组 (start, end) ,其中 start 和 end 分别是被匹配字符串的起始和结束位置。
修改下上面的例子,演示如何使用 `match` 对象:
import re
# 使用 re.search() 匹配字符串
string = "abc def ghi"
match = re.search(r'abc', string)
if match:
print('匹配成功!')
print('math = ', match)
print('匹配到的字符串:', match.group())
print('匹配到的起始位置:', match.start())
print('匹配到的结束位置:', match.end())
print('匹配到的位置范围:', match.span())
else:
print('匹配失败。')
执行结果:
匹配成功!
math = <re.Match object; span=(0, 3), match='abc'>
匹配到的字符串: abc
匹配到的起始位置: 0
匹配到的结束位置: 3
匹配到的位置范围: (0, 3)
re.search方法匹配到字符串,返回一个match对象,通过 `group()`、`start()`、`end()` 和 `span()` 方法分别获取到匹配字符串及其位置的详细信息。
需要注意的是,如果正则表达式没有匹配到目标字符串,`re.search()` 函数返回的 `match` 对象为 None,这时调用上述属性和方法会报错,因此在使用时要进行非空判断。
4、re.match方法
re.match()
是 Python re 模块中用于从字符串的起始位置对正则表达式进行匹配的函数,如果在起始位置匹配成功,则返回一个匹配对象;否则返回空值。
其语法如下:
re.match(pattern, string, flags=0)
参数说明:
pattern
: 正则表达式模式,规定了需要匹配的字符串的模板。string
: 要被匹配的字符串。flags
: 匹配标志,可选参数,默认为 0,表示采用 ASCII 编码方式。
使用示例:
import re
# 使用 re.match() 匹配字符串
string = "abc def ghi"
match = re.match(r'abc', string)
if match:
print('匹配成功!')
print('匹配到的字符串:', match.group())
else:
print('匹配失败。')
执行结果:
匹配成功!
匹配到的字符串: abc
5、re.match和re.search区别
re.match()
和 re.search()
都是 Python re 模块中的查找函数,可以用于查找符合指定条件(正则表达式)的字符串。两者的主要区别在于查找位置不同。
-
re.match()
只匹配字符串的开头部分,也就是说只能从字符串的起始位置开始匹配,而无法在字符串的中间或尾部进行匹配。 -
re.search()
则可以在整个字符串中进行匹配,如果在字符串的任意位置匹配成功,则返回一个匹配对象。如果在整个字符串中都没有找到匹配,函数将返回空值。
下面是两种函数的使用示例:
import re
string = "abc def ghi"
match1 = re.search(r'def', string) # 使用 re.search() 匹配字符串
match2 = re.match(r'def', string) # 使用 re.match() 匹配字符串
if match1:
print('匹配成功!')
print('匹配到的字符串:', match1.group())
else:
print('匹配失败。')
if match2:
print('匹配成功!')
print('匹配到的字符串:', match2.group())
else:
print('匹配失败。')
执行结果:
匹配成功!
匹配到的字符串: def
匹配失败。
这里字符串 "abc def ghi" 分别使用了 re.search()
和 re.match()
进行匹配,由于re.match()
只匹配字符串的开头部分,所有没有匹配到字符"def",匹配失败。
6、re.findall方法
`re.findall()` 是 Python re 模块中的函数,用于返回字符串中所有符合指定正则表达式模式的非重复匹配子串。
其语法如下:
re.findall(pattern, string, flags=0)
参数说明:
- `pattern`: 正则表达式模式,规定了需要匹配的字符串的模板。
- `string`: 要被搜索的字符串。
- `flags`: 匹配标志,可选参数,默认为 0,表示采用 ASCII 编码方式。
使用示例:
import re
# 查找字符串中所有数字
string = "I am 18 years old. My brother is 20."
result = re.findall(r'\d+', string)
print(result) # 输出:['18', '20']
上述代码演示了如何使用 `re.findall()` 函数。 `\d+` 表示要查找的是连续的数字,这里 `\d` 表示数字字符,`+` 表示前面的字符或组的出现一次或多次。函数返回的结果是一个由匹配的字符串组成的列表。
7、re.sub方法
`re.sub()` 是 Python re 模块中的函数,用于在主字符串中使用指定的正则表达式模式查找并替换子串。
其语法如下:
re.sub(pattern, repl, string, count=0, flags=0)
参数说明:
- `pattern`: 正则表达式模式,规定了需要匹配的字符串的模板。
- `repl`: 用于替换匹配项的字符串或函数。
- `string`: 要被搜索的主字符串。
- `count`: 最大的替换次数。可选参数,默认为 0,表示进行所有可能的替换操作。
- `flags`: 匹配标志,可选参数,默认为 0,表示采用 ASCII 编码方式。
使用示例:
import re
# 替换字符串中的数字为 "?"
string = "I am 18 years old. My brother is 20."
result = re.sub(r'\d+', '?', string)
print(result) # 输出:"I am ? years old. My brother is ?."
# 使用函数自定义替换策略
def replace_func(match):
return str(int(match.group()) * 2)
string = "I am 18 years old. My brother is 20."
result = re.sub(r'\d+', replace_func, string)
print(result) # 输出:"I am 36 years old. My brother is 40."
上述代码演示了两种情况下如何使用 `re.sub()` 函数。在第一个例子中,我们使用 `'\d+'` 表示要查找的是连续的数字,这里 `'\d'` 表示数字字符,`+` 表示前面的字符或组的出现一次或多次。然后将所有匹配项替换为 `"?"` 字符串。在第二个例子中,我们使用 `replace_func` 函数来自定义替换策略。对于找到的每个数字,调用 `replace_func` 函数进行处理(此处将数字翻倍),并将返回值用作替换原始字符串中匹配到的数字的结果。
需要注意的是,对于正则表达式模式,如果使用了类似 `.`、`\w` 之类的通配符,一定要小心,以免替换时误伤了其它部分。
8、re.compile方法
`re.compile()` 是 Python re 模块中的函数,用于将正则表达式模式编译为一个正则表达式对象(Pattern)。
其语法如下:
re.compile(pattern, flags=0)
参数说明:
- `pattern`: 正则表达式模式,规定了需要匹配的字符串的模板。
- `flags`: 匹配标志,可选参数,默认为 0,表示采用 ASCII 编码方式。
使用示例:
import re
# 将正则表达式模式编译为正则表达式对象
pattern = re.compile(r'\d+')
# 使用编译后的正则表达式对象查找匹配项
string = "I am 18 years old. My brother is 20."
result = pattern.findall(string)
print(result) # 输出:['18', '20']
上述代码演示了如何使用 `re.compile()` 函数合理地管理正则表达式。首先,我们将 `r'\d+'` 此正则表达式模式进行编译得到一个正则表达式对象 `pattern`,然后在主字符串 `string` 中使用 `pattern.findall()` 函数来查找所有符合 `pattern` 正则表达式模式的非重复子串。这里返回的结果和之前讲的 `re.findall()` 函数一样。
正则表达式对象可以多次重复使用。它缓存了编译得到的正则表达式模式的结果,可以避免多次编译造成的性能浪费。如果想使用不同匹配标志的正则表达式模式,可以在 `re.compile()` 函数中传入新的 `flags` 参数,即可得到另外一个新的编译后的正则表达式对象。
以下是一些常用正则表达式对象方法:
match(string[, pos[, endpos]])
: 从字符串起始位置开始匹配正则表达式,如果能够匹配成功,则返回一个 MatchObject 对象,否则返回 None。search(string[, pos[, endpos]])
: 在字符串中查找第一个能够匹配正则表达式的子串,如果能够匹配成功,则返回一个 MatchObject 对象,否则返回 None。findall(string[, pos[, endpos]])
: 查找所有能够匹配正则表达式的非重叠子串,并以列表方式返回所有匹配项。split(string[, maxsplit])
: 根据正则表达式模式分割字符串,并返回拆分后的所有非重叠子串组成的列表。sub(repl, string[, count])
: 使用给定字符串或函数按照指定规则(即正则表达式)进行替换,可选参数count
表示最大替换次数。
9、match对象和pattern对象
在 Python 的 re 模块中,有两个比较常用的对象:match 对象和 pattern 对象。
match 对象是一个包含匹配结果的对象,包括匹配到的字符串、匹配的位置等信息。它通常通过调用 re 模块提供的函数(如 re.match()、re.search())来获得。如果没有匹配成功,则返回 None。
示例:
import re
pattern = r'foo'
text = 'hello foobar'
match = re.search(pattern, text)
if match:
print('Match found:', match.group())
else:
print('No match')
上述代码使用 `re.search()` 函数,在文本 `text` 中搜索模式 `pattern`,并得到一个 match 对象。如果存在匹配结果,则打印出匹配到的字符串 "foo"。
pattern 对象则是通过 `re.compile()` 函数得到的编译后的正则表达式对象。这个对象缓存了编译后的正则表达式模式,可以重复使用(比如在多次查询的时候)。它也提供了一些方法来对文本进行匹配,比如 `search()`、`match()`、`findall()` 等等。
举个例子,下面的代码和之前示例的功能相同,只是使用了 compile 对象:
import re
pattern = re.compile(r'foo')
text = 'hello foobar'
match = pattern.search(text)
if match:
print('Match found:', match.group())
else:
print('No match')
上述代码先使用 `re.compile()` 函数创建了一个 pattern 对象,然后调用该对象的 `search()` 方法进行文本查询,结果与之前的示例一样。
总的来说,match 对象和 pattern 对象可以方便地处理文本匹配任务,提高了匹配的效率。
reference: