在处理文本信息时,我们常常需要通过匹配特定的字符串来提取所需的数据。正则表达式是一种強大的字符串匹配工具,是处理和过滤文本信息的常用手段之一。在 Python 中,使用 re 模块可以轻松实现正则表达式的匹配操作。它给我们提供了一些强大的功能和语法,可以帮助快速开发出精简高效的代码。

re模块的主要用途

re 模块最主要的作用就是进行字符串的正则匹配。它可以非常灵活地支持使用正则表达式去进行匹配。其中,使用最多的四个方法是 matchsearchfindallsub 。这些函数的基本用法如下:

re.match()

re.match() 函数主要用于从字符串的开头进行匹配,如果匹配成功,则返回一个Match对象,否则返回None。Match对象具有如下方法:

  • group():返回匹配到的字符串。
  • start():返回匹配开始的位置。
  • end():返回匹配结束的位置。
  • span():返回一个元组,包含匹配开始和结束的位置。

下面是一个示例:

1
2
3
4
5
6
7
8
9
10
import re

text = "Hello, Python fans!"
pattern = r"Hello"

match_obj = re.match(pattern, text)
if match_obj:
print(match_obj.group()) # 输出:Hello
else:
print("未匹配到任何字符串")

re.search() 函数在给定的文本中搜索一个正则表达式,实际上和re.match()几乎一样,所不同的是re.search()函数在字符串整个范围内进行搜索,而不只是字符串开始的部分。

下面是一个示例:

1
2
3
4
5
6
7
8
9
10
import re

text = "Hello, Python fans!"
pattern = r"Python"

match_obj = re.search(pattern, text)
if match_obj:
print(match_obj.group()) # 输出:Python
else:
print("未匹配到任何字符串")

re.findall()

re.findall() 函数找到文本中所有匹配正则表达式的部分,并以字符串列表的形式返回它们。如果正则表达式包含捕获组,那么返回的列表会包含每个组包含的字符串。

下面是一个示例:

1
2
3
4
5
6
7
import re

text = "John has 6 apples and 2 oranges"
pattern = r"\d+"

result_list = re.findall(pattern, text)
print(result_list) # 输出: ['6', '2']

re.sub()

re.sub() 函数可以将匹配正则表达式的所有子字符串进行替换,并返回结果,可以使用它来处理文本的格式或者进行文本数据的特定处理。具体来说,该函数包括四个参数:pattern、repl、string、count,其中pattern表示需要进行匹配的正则表达式,repl表示需要替换的字符串,string表示需要进行操作的字符串,count表示需要替换的最大次数,它是可选参数,默认值为0。

示例如下:

1
2
3
4
5
6
7
8
import re

text = "Python是一门多用途、高级编程语言。"
pattern = r"高级编程语言"
replace_str = "通用编程语言"

new_text = re.sub(pattern, replace_str, text)
print(new_text) # 输出:Python是一门多用途、通用编程语言。

标志

re 模块提供了一些标志(flags),用于修改正则表达式模式的行为。这些标志通常通过第三个可选参数(旧版本还有第四个参数)传递给 re.compile() 函数或 re 函数的匹配方法中。以下是 re 模块最常用的标志:

  • re.I / re.IGNORECASE: 忽略大小写匹配。这个标志告诉 re 模块在匹配时忽略大小写,例如,表达式 [A-Z] 能够匹配小写字母。

  • re.M / re.MULTILINE: 多行匹配。 多行模式是一个标志,使得元字符 ‘^’ 和 ‘$’ 分别匹配整个字符串中每一行的开始和结束位置,而不是仅仅匹配整个字符串的开始和结束位置。

  • re.S / re.DOTALL: 点号匹配全部字符。 默认模式下.点号匹配除 ‘\n’(换行符)之外的任何字符。当使用 re.S 或 re.DOTALL 标志时,点号将会匹配包括换行符在内的任何字符。

  • re.L / re.LOCALE: 做本地化识别(locale-aware)匹配。 只在某些非英语环境下有意义。它可以为一些特殊字符(如\xYY序列)提供本地化映射。

  • re.U / re.UNICODE: 使用 Unicode 规则进行匹配。 默认情况下,非 ASCII 字符将仅匹配本身。如果使用了这个标志,则能匹配 Unicode 字符。

  • re.X / re.VERBOSE: Verbose模式。 该标志告诉 re 解释器忽略空白和注释。

以下是一个示例,演示如何使用多个标志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re

text = """Hello World
This is a multiline string
"""

# re.I:忽略大小写
# re.S:匹配换行符
pattern = r"hello.*?string"
match = re.search(pattern, text, re.I | re.S)
if match:
print("Match found:", match.group())
else:
print("No match")

在这个示例中,我们通过使用re.Ire.S标志来忽略大小写和匹配换行符。我们可以通过将它们作为第三个参数传递给re.search函数来使用这些标志。该模式尝试匹配字符串中以 hello 开头、以 string 结尾的内容,而不区分大小写,同时在多个行中进行匹配。

基本的正则表达式语法

正则表达式可以包含各种字符,包括普通字符和特殊字符。其中,大多数普通字符表示自字母、数字和标点符号等,而特殊字符表示匹配一类特殊字符串的模式。下面是在 Python 中使用正则表达式的一些基本语法:

  • . :通配符,代表能匹配任意单个字符(除了换行符)
  • ^ :匹配字符串的开头位置
  • $ :匹配字符串的结尾位置
  • * :匹配0个或多个前一个字符
  • + :匹配1个或多个前一个字符
  • [] :代表能够匹配一组字符中的任意一个字符
  • [a-z] :可以匹配 a~z 中任意一个字母区分大小写。

re模块的一些实用技巧

在使用 re 模块的过程中,我们还可以使用一些技巧来提高使用效率。以下是一些常用的技巧:

  • 使用贪婪模式:尽量匹配到最后一项,匹配更多的字符。
  • 匹配优先级:从左到右进行匹配,匹配到满足条件的字符后继续向右匹配下一个字符。
  • 使用零宽断言:占用零字符,不会消耗字符,零宽断言可以使用 (?=) 和 (?! ) 其中,(?=)表示正前向零宽断言和(?! )表示负前向零宽断言。
  • 使用多行模式:一次性搜索多行文本。可以使用 re.MULTILINE 标志启用。