Python Tutorials

精通Python正则表达式

Spread the love

掌握Python正则表达式

正则表达式(regex或regexp)是用于字符串中模式匹配的强大工具。Python的re模块提供了一个全面的接口来处理它们,能够实现复杂的文本处理和数据提取。本教程将指导你学习必要的函数和概念,使你能够有效地利用正则表达式在你的Python项目中的强大功能。

目录

  1. re.match():从开头匹配
  2. re.search():查找第一个匹配项
  3. re.compile():优化性能
  4. 标志:修改匹配行为
  5. 字符集:定义允许的字符
  6. 使用re.sub()进行搜索和替换
  7. re.findall():提取所有匹配项
  8. re.finditer():迭代匹配项
  9. re.split():按模式分割字符串
  10. 基本模式:锚点、字符类
  11. 重复:量词和贪婪匹配与非贪婪匹配
  12. 特殊序列:数字、空格、单词字符
  13. re.escape():处理特殊字符
  14. 捕获组和group()方法

1. re.match():从开头匹配

re.match()函数尝试仅匹配字符串开头的模式。如果成功,则返回一个匹配对象,否则返回None


import re

text = "Hello World"
pattern = "Hello"
match = re.match(pattern, text)

if match:
    print("匹配成功:", match.group(0))
else:
    print("未找到匹配项")

re.search()扫描整个字符串以查找模式的第一次出现。与re.match()不同,它不需要匹配项出现在开头。


import re

text = "Hello World"
pattern = "World"
match = re.search(pattern, text)

if match:
    print("匹配成功:", match.group(0))
else:
    print("未找到匹配项")

3. re.compile():优化性能

为了提高性能,尤其是在重复使用相同模式的情况下,可以使用re.compile()对其进行编译。这将创建一个可重用的模式对象。


import re

compiled_pattern = re.compile(r"d+")  # 编译模式
text1 = "There are 123 apples"
text2 = "And 456 oranges"

match1 = compiled_pattern.search(text1)
match2 = compiled_pattern.search(text2)

print(match1.group(0))  # 输出:123
print(match2.group(0))  # 输出:456

4. 标志:修改匹配行为

标志修改匹配过程。re.IGNORECASE执行不区分大小写的匹配,re.MULTILINE将每一行视为^$锚点的单独字符串。


import re

text = "Hello world"
pattern = re.compile("hello", re.IGNORECASE)
match = pattern.search(text)
print(match.group(0))  # 输出:Hello

5. 字符集:定义允许的字符

字符集([])指定允许的字符。例如,[a-z]匹配小写字母。


import re

text = "abc123XYZ"
pattern = re.compile("[a-z]+")
match = pattern.search(text)
print(match.group(0))  # 输出:abc

6. 使用re.sub()进行搜索和替换

re.sub()将模式的出现替换为替换字符串。


import re

text = "Hello World"
new_text = re.sub("World", "Python", text)
print(new_text)  # 输出:Hello Python

7. re.findall():提取所有匹配项

re.findall()返回所有不重叠匹配项的列表。


import re

text = "123 abc 456 def"
numbers = re.findall(r"d+", text)
print(numbers)  # 输出:['123', '456']

8. re.finditer():迭代匹配项

re.finditer()返回一个迭代器,生成匹配对象。对于大型字符串中的许多匹配项,它更节省内存。


import re

text = "123 abc 456 def"
for match in re.finditer(r"d+", text):
    print(match.group(0))  # 输出:123, 456 (分别在不同的行上)

9. re.split():按模式分割字符串

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


import re

text = "apple,banana,cherry"
fruits = re.split(r",", text)
print(fruits)  # 输出:['apple', 'banana', 'cherry']

10. 基本模式:锚点、字符类

  • .:匹配除换行符以外的任何字符。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • []:匹配一组字符(例如,[abc][a-z])。
  • [^...]:匹配不在集合中的任何字符(否定字符集)。

11. 重复:量词和贪婪匹配与非贪婪匹配

  • *:零个或多个出现。
  • +:一个或多个出现。
  • ?:零个或一个出现。
  • {m}:正好m个出现。
  • {m,n}:从mn个出现。
  • *?+???{m,n}?:非贪婪版本(匹配最短可能的字符串)。

12. 特殊序列:数字、空格、单词字符

  • d:匹配任何数字(0-9)。
  • D:匹配任何非数字字符。
  • s:匹配任何空格字符(空格、制表符、换行符)。
  • S:匹配任何非空格字符。
  • w:匹配任何字母数字字符(字母、数字、下划线)。
  • W:匹配任何非字母数字字符。

13. re.escape():处理特殊字符

re.escape()转义字符串中的特殊字符,允许你将其用作字面模式,而不会产生意外的正则表达式解释。

14. 捕获组和group()方法

括号()创建捕获组。group()方法访问捕获的子字符串。


import re

text = "My phone number is 123-456-7890"
match = re.search(r"(d{3})-(d{3})-(d{4})", text)
if match:
    区号 = match.group(1)
    前缀 = match.group(2)
    号码 = match.group(3)
    print(f"区号:{区号},前缀:{前缀},号码:{号码}")

本教程提供了Python re模块的坚实基础。进一步探索高级技术将显著增强你的字符串处理能力。请记住查阅官方Python文档以获取完整的参考。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注