Python ``re`` 模块基础与高级用法


发布日期 : 2020-07-24 22:35:29 UTC

访问量: 10 次浏览

Python 正则表达式查找字符串

在Python中,正则表达式经常用于查找、匹配和替换字符串中的内容。
正则表达式是一种描述性的语言,它使用特定的语法规则来查找文本中的模式。
Python通过re模块提供对正则表达式的支持,可以使用re模块提供的函数来创建、编译和使用正则表达式。

正则表达式基础

正则表达式由普通字符(例如’a’到’z’、’A’到’Z’、’0’到’9’)和特殊字符(称为元字符)组成。
元字符可以用来定义字符串中的位置、字符集、重复次数等。

下面是常见的元字符:

  • . :匹配任意一个字符(除了换行符)
  • ^ :匹配字符串开头
  • $ :匹配字符串结尾
  • * :表示前面的字符可以重复出现0到多次
  • + :表示前面的字符可以重复出现1到多次
  • ? :表示前面的字符可以重复出现0到1次
  • {m} :表示前面的字符重复出现m次
  • {m,} :表示前面的字符至少重复出现m次
  • {m,n} :表示前面的字符重复出现m到n次
  • [] :表示字符集,匹配其中的任意一个字符
  • | :或运算,匹配两个选择中的任意一个

例如,正则表达式 a.*b 可以匹配以 a 开头,以 b 结尾且中间包含任意个字符的字符串。

re模块基础

Python内置的re模块提供了一组函数来使用正则表达式。以下是 re 模块中最常用的函数:

re.search

re.search 函数在指定的字符串中查找第一个与正则表达式匹配的子串,并返回一个匹配对象。
如果找到,则可以使用 group 方法获取匹配的子串。如果没找到,则返回None。

例如,下面的代码展示了如何使用 re.search 函数查找字符串中的子串:

import re

pattern = 'hello'
string = 'hello world'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group()) # 输出hello
else:
print('未匹配到该字符串')

re.match

re.match 函数也是在指定的字符串中查找第一个与正则表达式匹配的子串,并返回一个匹配对象。
但是, re.match 函数只会在字符串开头进行匹配,如果匹配成功,则返回匹配对象,否则返回None。

例如,下面的代码展示了如何使用 re.match 函数查找字符串中的子串:

import re

pattern = 'hello'
string = 'hello world'
match_obj = re.match(pattern, string)
if match_obj:
print(match_obj.group()) # 输出hello
else:
print('未匹配到该字符串')

re.findall

re.findall 函数在指定的字符串中查找所有与正则表达式匹配的子串,并以列表形式返回结果。
如果没有匹配到,则返回空列表。

例如,下面的代码展示了如何使用 re.findall 函数查找字符串中的子串:

import re

pattern = '[0-9]+'
string = '2019年是中华人民共和国成立70周年'
match_obj = re.findall(pattern, string)
print(match_obj) # 输出['2019', '70']

re.sub

re.sub 函数将匹配正则表达式的子串替换为指定的字符串,并返回替换后的字符串。
如果没有匹配的子串,则返回原始的字符串。

例如,下面的代码展示了如何使用 re.sub 函数替换字符串中的子串:

import re

pattern = 'hello'
string = 'hello world'
replace_str = 'hi'
new_string = re.sub(pattern, replace_str, string)
print(new_string) # 输出hi world

正则表达式高级用法

除了基础用法,正则表达式还支持一些高级用法。

分组

分组可以将多个正则表达式组合成一个更复杂的正则表达式。
通过括号将要匹配的子串括起来,可以实现分组。通过 group 方法可以获取每个分组匹配到的子串。

例如,正则表达式 (\w+) (\w+) 用于匹配由英文字母组成的字符串中的前两个单词,
其中 \w 表示匹配任意字母、数字或下划线。

下面的代码展示了如何使用分组查找字符串中的子串:

import re

pattern = r'(\w+) (\w+)'
string = 'hello world'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group(0)) # 输出hello world,完整的匹配字符串
print(match_obj.group(1)) # 输出hello,第一个分组匹配到的子串
print(match_obj.group(2)) # 输出world,第二个分组匹配到的子串
else:
print('未匹配到该字符串')

非贪婪匹配

默认情况下,正则表达式是贪婪的,即在匹配时尽可能多地匹配字符。
例如,正则表达式 a.+b 会匹配字符串 a test string b another string b 中的整个字符串,而不是期望的两个子串。为了改变这种默认行为,可以使用非贪婪匹配。

非贪婪匹配使用 ? 元字符来实现。
例如,正则表达式 a.+?b 会匹配字符串 a test string b another string b 中的两个子串。

下面的代码展示了如何使用非贪婪匹配查找字符串中的子串:

import re

pattern = r'a.+?b'
string = 'a test string b another string b'
match_obj = re.search(pattern, string)
if match_obj:
print(match_obj.group()) # 输出a test string b
else:
print('未匹配到该字符串')

使用编译的正则表达式

正则表达式在使用时需要先编译,然后才能使用。
编译正则表达式可以提高程序的效率,避免多次重复编译,同时编译后的正则表达式可以在多个函数中共享。

可以使用 re.compile 函数来编译正则表达式。
这个函数会返回一个正则表达式对象,可以在之后使用其他 re 模块函数来对其中的字符串进行操作。

例如,下面的代码展示了如何使用编译的正则表达式来查找字符串中的子串:

import re

pattern = r'[0-9]+'
string = '2019年是中华人民共和国成立70周年'

regex = re.compile(pattern)
match_obj = regex.findall(string)
print(match_obj) # 输出['2019', '70']

结论

正则表达式是一个非常强大的工具,可以用于查找、匹配和替换字符串中的内容。
Python内置的 re 模块提供了一组函数来使用正则表达式,可以使用这些函数来创建、编译和使用正则表达式。
掌握正则表达式的基础和高级用法,可以大大提高处理字符串的效率和灵活性。