Python 正则表达式(re)

目录

一、概述

二、基本概念

模式字符串

原始字符串

编译正则表达式

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

字符匹配

锚点

量词

四、常用函数

re.match()

re.search()

re.findall()

re.finditer()

re.sub()

五、高级主题

分组和捕获

非贪婪匹配

前瞻和后顾(零宽断言)

六、编译正则表达式

七、错误处理


一、概述

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

二、基本概念

模式字符串

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

原始字符串

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

python 复制代码
pattern = r'\bfoo\b'
编译正则表达式

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

python 复制代码
compiled_pattern = re.compile(r'\bfoo\b')

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

字符匹配
  • .:匹配除换行符以外的任何单个字符
  • [...]:匹配字符集合中的一个字符
  • [^...]:匹配不在字符集合中的一个字符
  • \d:匹配任何数字,等价于[0-9]
  • \D:匹配任何非数字字符,等价于[^0-9]
  • \s:匹配任何空白字符,包括空格、制表符、换页符等,等价于[ \t\n\r\f\v]
  • \S:匹配任何非空白字符,等价于[^ \t\n\r\f\v]
  • \w:匹配任何字母数字字符,等价于[a-zA-Z0-9_]
  • \W:匹配任何非字母数字字符,等价于[^a-zA-Z0-9_]
锚点
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • \A:匹配字符串的开始(不受多行模式的影响)
  • \Z:匹配字符串的结束(不受多行模式的影响)
  • \b:匹配一个单词边界
  • \B:匹配非单词边界
量词
  • *:匹配前面的子表达式零次或多次
  • +:匹配前面的子表达式一次或多次
  • ?:匹配前面的子表达式零次或一次
  • {n}:匹配前面的子表达式恰好n次
  • {n,}:匹配前面的子表达式至少n次
  • {n,m}:匹配前面的子表达式至少n次,但不超过m次

四、常用函数

re.match()

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

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

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

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

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

python 复制代码
findall = re.findall(r'\d+', '123abc456def')
print('All matches:', findall)
re.finditer()

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

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

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

python 复制代码
replaced = re.sub(r'\d+', 'number', '123abc456def')
print('Replaced:', replaced)

五、高级主题

分组和捕获

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

python 复制代码
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})后面加上?,可以进行非贪婪匹配,即尽可能少地匹配字符。

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

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

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

六、编译正则表达式

re.compile()

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

python 复制代码
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.IGNORECASEre.I:忽略大小写。
  • re.MULTILINEre.M:多行模式,改变 ^$ 的行为。
  • re.DOTALLre.S:使 . 匹配任何字符,包括换行符。

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

python 复制代码
pattern = re.compile(r'[a-z]+', re.I)

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

七、错误处理

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

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

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

相关推荐
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸1 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农1 小时前
Python 继承、多态、封装、抽象
开发语言·python
Python大数据分析@2 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树2 小时前
简单的签到程序 python笔记
笔记·python
Shy9604182 小时前
Bert完形填空
python·深度学习·bert
上海_彭彭2 小时前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
zhongcx012 小时前
使用Python查找大文件的实用脚本
python
yyfhq3 小时前
sdnet
python
测试19983 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试