python模块 — 正则表达式 re

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)

下面对这个函数的三个参数进行说明:

  1. pattern: 匹配模式,定义需要查找的字符串的规则。可以是一个普通字符串也可以是一个正则表达式。
  2. string: 需要被查找的字符串。
  3. 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:

re --- 正则表达式操作 — Python 3.8.16 文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值