目录

一、概述

二、基本概念

模式字符串

原始字符串

编译正则表达式

三、正则表达式的基本模式匹配

字符匹配

锚点

量词

四、常用函数

re.match()

re.search()

re.findall()

re.finditer()

re.sub()

五、高级主题

分组和捕获

非贪婪匹配

前瞻和后顾(零宽断言)

六、编译正则表达式

七、错误处理


一、概述

正则表达式是一种强大的字符串匹配工具,通过定义搜索模式,可以在文本中搜索、替换符合条件的字符串。在 Python 中,正则表达式模块由 re 提供支持。本文将详细介绍正则表达式的语法、常用函数和高级用法。

二、基本概念

模式字符串

正则表达式由模式字符串定义,它包含了正则表达式的语法和符号。

原始字符串

建议使用原始字符串(前面带有r的字符串)来表示模式字符串,这样可以避免转义字符带来的混淆。

pattern = r'\bfoo\b'
编译正则表达式

虽然可以直接使用正则表达式,但编译正则表达式可以提高效率,尤其是在多次使用同一表达式时。

compiled_pattern = re.compile(r'\bfoo\b')

三、正则表达式的基本模式匹配

字符匹配
锚点
量词

四、常用函数

re.match()

re.match()函数从字符串的开始处匹配正则表达式。如果匹配成功,返回一个匹配对象;否则返回None

match = re.match(r'\d+', '123abc')
if match:
    print('Found:', match.group(0))
re.search()

re.search()函数在整个字符串中搜索匹配的正则表达式,返回第一个匹配对象。

search = re.search(r'\d+', 'abc123def')
if search:
    print('Found:', search.group(0))
re.findall()

re.findall()函数返回字符串中所有匹配正则表达式的部分的列表。

findall = re.findall(r'\d+', '123abc456def')
print('All matches:', findall)
re.finditer()

re.finditer()函数返回一个迭代器,其中包含字符串中所有匹配正则表达式的部分。

for match in re.finditer(r'\d+', '123abc456def'):
    print('Found:', match.group(0))
re.sub()

re.sub()函数用于替换字符串中匹配正则表达式的部分。

replaced = re.sub(r'\d+', 'number', '123abc456def')
print('Replaced:', replaced)

五、高级主题

分组和捕获

使用圆括号进行分组,可以在后面引用这些分组。

grouped = re.search(r'(\d+).+(\d+)', '123abc456def')
if grouped:
    print('First group:', grouped.group(1))
    print('Second group:', grouped.group(2))
非贪婪匹配

在Python的re模块中,正则表达式默认是贪婪匹配。这意味着在进行匹配时,正则表达式会尽可能地匹配更多的字符。

在量词(*, +, ?, {n,m})后面加上?,可以进行非贪婪匹配,即尽可能少地匹配字符。

nongreedy = re.search(r'\d+?', '123abc')
if nongreedy:
    print('Non-greedy match:', nongreedy.group(0))
前瞻和后顾(零宽断言)

使用前瞻和后顾可以在不包含在匹配中的情况下,断言此位置前后是否能匹配模式。

  • 正前瞻 (?=...):匹配...前面的位置。
  • 负前瞻 (?!...):匹配不在...前面的位置。
  • 正后顾 (?<=...):匹配...后面的位置。
  • 负后顾 (?<!...):匹配不在...后面的位置。
lookahead = re.search(r'\d(?=\D)', '123abc')
if lookahead:
    print('Lookahead match:', lookahead.group(0))

六、编译正则表达式

re.compile()

re.compile() 函数是 re 模块中的一个重要函数,它用于将正则表达式的字符串形式编译成一个 Pattern 对象。预编译可以让你在后续的查找或匹配中重复使用该正则表达式,而无需每次使用时都重新编译,这样可以提高效率。

import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'\d+')  # 匹配一个或多个数字

# 使用Pattern对象进行匹配
match_result = pattern.match('123abc')
if match_result:
    print(match_result.group())  # 输出:123

search_result = pattern.search('abc123def')
if search_result:
    print(search_result.group())  # 输出:123

# 使用Pattern对象查找所有匹配项
findall_result = pattern.findall('123abc456def')
print(findall_result)  # 输出:['123', '456']

# 使用Pattern对象进行迭代查找
for match in pattern.finditer('123abc456def'):
    print(match.group())  # 输出:123 然后 456

# 使用Pattern对象替换字符串中的模式
sub_result = pattern.sub("#", '123abc456def')
print(sub_result)  # 输出:#abc#def

re.compile() 函数接受一个额外的标志参数 flags,这些标志可以改变正则表达式的工作方式。例如:

  • re.IGNORECASE 或 re.I:忽略大小写。
  • re.MULTILINE 或 re.M:多行模式,改变 ^ 和 $ 的行为。
  • re.DOTALL 或 re.S:使 . 匹配任何字符,包括换行符。

例如,如果我们想让正则表达式忽略大小写,可以这样编译它:

pattern = re.compile(r'[a-z]+', re.I)

这个编译后的 Pattern 对象可以用来匹配任意字母序列,不论大小写。

七、错误处理

使用re模块时,可能会遇到re.error异常,通常是因为正则表达式的语法错误。

try:
    re.search(r'(\d', '123abc')  # 缺少闭合的圆括号
except re.error as e:
    print('Regex error:', e)

这个简介涵盖了Python中re模块的基本使用和主要功能。要精通正则表达式,需要大量的练习和对复杂文本模式的理解。正则表达式是一个强大的工具,但也需要谨慎使用,因为复杂的表达式可能难以维护和理解。

04-06 00:13