Python正则表达式的用法实用技巧总结

 更新时间:2026年06月29日 10:23:29   作者:云攀登者-望正茂  
正则表达式是Python编程中处理文本的强大工具,能够帮助开发者快速实现字符串匹配、搜索和替换等操作,这篇文章主要介绍了Python正则表达式用法实用技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

正则表达式基础

正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找和替换字符串中的特定模式。Python 通过 re 模块提供了对正则表达式的支持。

import re

常用元字符

元字符是正则表达式中具有特殊意义的字符,常见的元字符包括:

  • .:匹配任意单个字符(除了换行符)。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • {n}:匹配前面的字符恰好 n 次。
  • {n,}:匹配前面的字符至少 n 次。
  • {n,m}:匹配前面的字符至少 n 次,至多 m 次。
  • []:匹配括号内的任意一个字符。
  • |:表示“或”关系。
import re
pattern = r"a.b"
text = "aab abb acb"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['aab', 'abb', 'acb']

字符类

字符类用于匹配一组字符中的任意一个。常见的字符类包括:

  • \d:匹配任意数字字符,等价于 [0-9]
  • \D:匹配任意非数字字符,等价于 [^0-9]
  • \w:匹配任意字母、数字或下划线字符,等价于 [a-zA-Z0-9_]
  • \W:匹配任意非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_]
  • \s:匹配任意空白字符,包括空格、制表符、换行符等。
  • \S:匹配任意非空白字符。
pattern = r"\d{3}-\d{2}-\d{4}"
text = "My SSN is 123-45-6789."
match = re.search(pattern, text)
if match:
    print("Found SSN:", match.group())  # 输出: Found SSN: 123-45-6789

分组与捕获

使用圆括号 () 可以将正则表达式中的一部分分组,并且可以捕获匹配的内容。捕获的内容可以通过 group() 方法获取。

pattern = r"(\d{3})-(\d{2})-(\d{4})"
text = "My SSN is 123-45-6789."
match = re.search(pattern, text)
if match:
    print("Full match:", match.group(0))  # 输出: Full match: 123-45-6789
    print("Group 1:", match.group(1))  # 输出: Group 1: 123
    print("Group 2:", match.group(2))  # 输出: Group 2: 45
    print("Group 3:", match.group(3))  # 输出: Group 3: 6789

非捕获分组

有时需要分组但不捕获匹配的内容,可以使用 (?:...) 语法。

pattern = r"(?:\d{3})-(\d{2})-(\d{4})"
text = "My SSN is 123-45-6789."
match = re.search(pattern, text)
if match:
    print("Full match:", match.group(0))  # 输出: Full match: 123-45-6789
    print("Group 1:", match.group(1))  # 输出: Group 1: 45
    print("Group 2:", match.group(2))  # 输出: Group 2: 6789

贪婪与非贪婪匹配

默认情况下,正则表达式是贪婪的,会尽可能多地匹配字符。可以在量词后面加上 ? 来启用非贪婪匹配。

pattern_greedy = r"<.*>"
pattern_non_greedy = r"<.*?>"
text = "<html><head><title>Page Title</title></head></html>"
match_greedy = re.search(pattern_greedy, text)
match_non_greedy = re.search(pattern_non_greedy, text)
print("Greedy match:", match_greedy.group())  # 输出: Greedy match: <html><head><title>Page Title</title></head></html>
print("Non-greedy match:", match_non_greedy.group())  # 输出: Non-greedy match: <html>

查找与替换

re.sub() 函数用于查找并替换字符串中的匹配项。

pattern = r"\d+"
text = "There are 3 apples and 5 oranges."
result = re.sub(pattern, "X", text)
print(result)  # 输出: There are X apples and X oranges.

编译正则表达式

对于需要多次使用的正则表达式,可以将其编译为 re.Pattern 对象,以提高效率。

pattern = re.compile(r"\d{3}-\d{2}-\d{4}")
text = "My SSN is 123-45-6789."
match = pattern.search(text)
if match:
    print("Found SSN:", match.group())  # 输出: Found SSN: 123-45-6789

多行匹配

re.MULTILINE 标志允许 ^$ 分别匹配每一行的开头和结尾,而不是整个字符串的开头和结尾。

pattern = r"^\d+"
text = "1 apple\n2 oranges\n3 bananas"
matches = re.findall(pattern, text, re.MULTILINE)
print(matches)  # 输出: ['1', '2', '3']

忽略大小写

re.IGNORECASE 标志使匹配忽略大小写。

pattern = r"apple"
text = "Apple is a fruit."
match = re.search(pattern, text, re.IGNORECASE)
if match:
    print("Found:", match.group())  # 输出: Found: Apple

正则表达式的高级技巧

正向预查

正向预查 (?=...) 用于匹配后面跟着特定模式的字符串,但不包括该模式本身。

pattern = r"\d+(?= dollars)"
text = "I have 100 dollars."
match = re.search(pattern, text)
if match:
    print("Found:", match.group())  # 输出: Found: 100

负向预查

负向预查 (?!...) 用于匹配后面不跟着特定模式的字符串。

pattern = r"\d+(?! dollars)"
text = "I have 100 euros."
match = re.search(pattern, text)
if match:
    print("Found:", match.group())  # 输出: Found: 100

命名分组

命名分组 (?P<name>...) 可以为捕获的分组指定一个名称,方便后续引用。

pattern = r"(?P<area>\d{3})-(?P<group>\d{2})-(?P<serial>\d{4})"
text = "My SSN is 123-45-6789."
match = re.search(pattern, text)
if match:
    print("Area:", match.group("area"))  # 输出: Area: 123
    print("Group:", match.group("group"))  # 输出: Group: 45
    print("Serial:", match.group("serial"))  # 输出: Serial: 6789

正则表达式的调试

正则表达式有时难以调试,可以使用 re.DEBUG 标志来查看正则表达式的解析过程。

pattern = re.compile(r"\d{3}-\d{2}-\d{4}", re.DEBUG)

正则表达式的性能优化

正则表达式的性能可能会受到模式复杂性和输入文本大小的影响。以下是一些优化建议:

  • 尽量使用非贪婪匹配。
  • 避免使用嵌套量词。
  • 使用预编译的正则表达式对象。
  • 使用 re.finditer() 代替 re.findall() 以节省内存。
pattern = re.compile(r"\d{3}-\d{2}-\d{4}")
text = "My SSN is 123-45-6789."
for match in pattern.finditer(text):
    print("Found SSN:", match.group())  # 输出: Found SSN: 123-45-6789

正则表达式的常见应用场景

验证电子邮件地址

pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
email = "example@example.com"
if re.match(pattern, email):
    print("Valid email address")
else:
    print("Invalid email address")

提取 URL

pattern = r"https?://(?:www\.)?\S+"
text = "Visit https://example.com for more info."
matches = re.findall(pattern, text)
print(matches)  # 输出: ['https://example.com']

提取 HTML 标签

pattern = r"<(\w+)[^>]*>(.*?)</\1>"
html = "<h1>Title</h1><p>Paragraph</p>"
matches = re.findall(pattern, html)
print(matches)  # 输出: [('h1', 'Title'), ('p', 'Paragraph')]

总结

正则表达式是处理文本的强大工具,掌握其基本语法和高级技巧可以显著提高文本处理的效率。通过合理使用正则表达式,可以轻松应对各种复杂的文本匹配和替换任务。

到此这篇关于Python正则表达式的用法实用技巧总结的文章就介绍到这了,更多相关Python正则表达式技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现统计给定字符串中重复模式最高子串功能示例

    Python实现统计给定字符串中重复模式最高子串功能示例

    这篇文章主要介绍了Python实现统计给定字符串中重复模式最高子串功能,涉及Python针对字符串的遍历、排序、切片、运算等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • matplotlib实现区域颜色填充

    matplotlib实现区域颜色填充

    这篇文章主要为大家详细介绍了matplotlib实现区域颜色填充,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • json跨域调用python的方法详解

    json跨域调用python的方法详解

    这篇文章主要介绍了json跨域调用python的方法,结合实例形式分析了基于ajax的json调用及Python后台处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Python实现Excel报表自动化的实践教程

    Python实现Excel报表自动化的实践教程

    这篇文章主要为大家详细介绍了如何使用Python实现Excel报表自动化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-03-03
  • 安装.whl文件(Python Wheel包)的三种方法

    安装.whl文件(Python Wheel包)的三种方法

    .whl文件是Python的二进制包,通常用于安装Python库,下面这篇文章主要介绍了安装.whl文件(Python Wheel包)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • 解决pandas报错'DataFrame' object has no attribute 'as_matrix'问题

    解决pandas报错'DataFrame' object has no

    这篇文章主要介绍了解决pandas报错'DataFrame' object has no attribute 'as_matrix'问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python request操作步骤及代码实例

    Python request操作步骤及代码实例

    这篇文章主要介绍了Python request操作步骤及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Django Rest framework之认证的实现代码

    Django Rest framework之认证的实现代码

    这篇文章主要介绍了Django Rest framework之认证的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Python Requests爬虫之求取关键词页面详解

    Python Requests爬虫之求取关键词页面详解

    这篇文章主要为大家详细介绍了Python Requests爬虫之求取关键词页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 解决numpy和torch数据类型转化的问题

    解决numpy和torch数据类型转化的问题

    这篇文章主要介绍了解决numpy和torch数据类型转化的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论