【python】python进阶——re模块(正则表达式)

目录

引言

一、正则表达式

二、正则表达式语法详解

2.1 基本元字符

2.2 匹配结果方法

2.3 编译标志(flags 参数)

2.4 re模块核心函数

三、注意事项

参考


引言

        正则表达式是文本处理的瑞士军刀,而Python的re模块则是操作这把利器的重要工具包。无论你是需要验证用户输入、从文本中提取数据,还是进行复杂的文本替换操作,re模块都能提供强大而灵活的支持。

一、正则表达式

        正则表达式(Regular Expression,简称regex)是一种用于描述字符串模式的特殊语法。它使用一系列特殊字符和普通字符来定义一种模式,然后用这种模式去匹配、查找、替换或分割文本。

python的re模块导入方法:

import re

二、正则表达式语法详解

2.1 基本元字符

元字符 功能描述 示例 匹配结果
. 匹配任意单个字符(除了换行符) a.b 匹配"aab", "a5b", "a b"等
^ 匹配字符串的开头 ^Hello 匹配以"Hello"开头的字符串
$ 匹配字符串的结尾 world$ 匹配以"world"结尾的字符串
* 匹配前面的子表达式零次或多次 ab*c 匹配"ac", "abc", "abbc"等
+ 匹配前面的子表达式一次或多次 ab+c 匹配"abc", "abbc"等,但不匹配"ac"
? 匹配前面的子表达式零次或一次 colou?r 匹配"color"和"colour"
{m} 匹配前面的子表达式恰好m次 a{3} 匹配"aaa"
{m,n} 匹配前面的子表达式至少m次,最多n次 a{2,4} 匹配"aa", "aaa"或"aaaa"
[ ] 字符集合,匹配所包含的任意一个字符 [abc] 匹配a、b或c中的任意一个字符
[^ ] 负值字符集合,匹配未包含的任意字符 [^abc] 匹配除了a、b、c之外的任何字符
[a-z] 匹配a到z之间的所有小写字母 [a-z] 匹配任何小写字母
| 或运算符,匹配左边或右边的表达式 cat|dog 匹配"cat"或"dog"
( ) 分组标记,将表达式分组并捕获匹配的文本 (ab)+ 匹配"ab", "abab"等
(?: ) 定义非捕获分组
\ 转义字符,将特殊字符转义为普通字符 \. 匹配句点"."本身
\d 匹配数字 \d+  匹配"123"
\D 匹配非数字 \D+  匹配"abc"
\w 匹配单词字符(字母、数字、下划线) \w+  匹配"A_a"
\W 匹配非单词字符 \W+  匹配"#!"
\s 匹配空白字符(空格、制表符等) \s+  匹配"\t"
\S 匹配非空白字符 \S+  匹配"abc"

2.2 匹配结果方法

方法/属性 说明 示例
group() 返回整个匹配的字符串 ret.group() → 'abc'
group(n) 返回第n个捕获组的内容

ret= re.search(r'(\d)(\d)', '12')

ret.group(1) → '1'

groups() 返回所有捕获组的元组 ret.groups() → ('1', '2')
start() 匹配的起始位置 ret.start() → 0
end() 匹配的结束位置 ret.end() → 5
span() 返回匹配范围 (start, end) ret.span() → (0, 2)

2.3 编译标志(flags 参数)

标志

简写 说明 示例
re.IGNORECASE  re.I 忽略大小写 re.search(r'abc', 'ABC', re.I)
re.MULTILINE re.M 多行模式(影响 ^ 和 $ re.findall(r'^\d+', '1\n2', re.M) → ['1', '2']
re.DOTALL re.S 让 . 匹配包括换行符的所有字符 re.search(r'a.*b', 'a\nb', re.S)
re.ASCII 让 \w\W 等仅匹配ASCII字符 re.search(r'\w+', 'こん', re.ASCII) → 无匹配
re.VERBOSE re.X 允许正则中添加注释和空格 re.***pile(r'''\d+ # 匹配数字''', re.X)

2.4 re模块核心函数

 re.***plie() -预编译正则表达式

在需要多次使用同一个模式时,先将其编译成一个正则表达式对象(Pattern Object),可以显著提高效率。

import re

# 未编译模式,每次调用都要重新编译
result1 = re.match(r"\d+", "123abc")
result2 = re.search(r"\d+", "abc123")

# 编译模式,一次编译,多次使用
pattern = re.***pile(r"\d+")
result1 = pattern.match("123abc")
result2 = pattern.search("abc123")
# 编译后的对象同样拥有 match, search, findall, sub, split 等方法
results_all = pattern.findall("a1b23c456")

何时使用: 当一个模式需要被重复使用上百次或上千次时,预编译的性能优势才会比较明显。对于简单脚本或单次使用,直接使用 re 模块的函数更简洁。

 re.fullmatch() - 整个字符串完全匹配

检查整个字符串是否完全匹配给定的模式。可以理解为模式就是整个字符串的定义。

import re

pattern = r"\d{3}" # 匹配3位数字
text1 = "123"
text2 = "123a"

result1 = re.fullmatch(pattern, text1) # 匹配成功
result2 = re.fullmatch(pattern, text2) # 匹配失败,因为字符串不是纯粹的3位数字

if result1:
    print(f"'{text1}' 完全由3位数字组成")
# 输出: '123' 完全由3位数字组成

 re.match() - 从字符串起始位置匹配

import re
​
pattern = r"hello"
text = "hello world"
result = re.match(pattern, text)
​
if result:
    print("匹配成功:", result.group())
else:
    print("匹配失败")

 re.search() - 扫描整个字符串查找匹配

pattern = r"world"
text = "hello world"
result = re.search(pattern, text)
​
if result:
    print("找到匹配:", result.group())
    print("起始位置:", result.start())
    print("结束位置:", result.end())

 re.findall() - 查找所有匹配项

pattern = r"\d+"  # 匹配一个或多个数字
text = "我有3个苹果和15个橘子"
results = re.findall(pattern, text)
print("所有数字:", results)  # 输出: ['3', '15']

 re.finditer() - 返回匹配项的迭代器

pattern = r"\w+"
text = "Hello world, Python regex!"
for match in re.finditer(pattern, text):
    print(f"找到 '{match.group()}' 在位置 {match.start()}-{match.end()}")

 re.sub() - 字符串替换

pattern = r"apple"
text = "I have an apple and another apple"
new_text = re.sub(pattern, "orange", text)
print(new_text)  # 输出: I have an orange and another orange

 re.split() - 根据模式分割字符串

pattern = r"\s+"  # 一个或多个空白字符
text = "Hello   world   from   Python"
parts = re.split(pattern, text)
print(parts)  # 输出: ['Hello', 'world', 'from', 'Python']

三、注意事项

  • 尽量使用具体而不是模糊的模式

  • 避免过度使用回溯

  • 考虑预编译常用模式

  • 使用注释和 verbose 模式

  • 将复杂模式分解为多个简单模式

  • 添加详细的注释

  • 根据需求选择合适的函数(match、search、findall等)

  • 合理使用正则表达式语法元字符

  • 对于复杂或频繁使用的模式,考虑预编译

  • 注意性能问题,避免过度复杂的模式

  • 使用verbose模式和注释提高可读性

参考

  • Python官方re模块文档

  • 正则表达式可视化工具

  • Python re 模块 | 菜鸟教程

转载请说明出处内容投诉
CSS教程网 » 【python】python进阶——re模块(正则表达式)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买