python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python正则表达式技巧

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

作者:云攀登者-望正茂

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

正则表达式基础

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

import re

常用元字符

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

import re
pattern = r"a.b"
text = "aab abb acb"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['aab', 'abb', 'acb']

字符类

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

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)

正则表达式的性能优化

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

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正则表达式技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文