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