Python 正则表达式速查表
正则表达式,通常称为 regex,是 Python 编程中用于模式匹配和文本操作的强大工具。它们允许您根据特定模式搜索、提取和修改文本,使其成为数据验证、字符串操作和文本处理等任务必不可少的工具。
然而,使用正则表达式可能具有挑战性,尤其对于初学者或不经常使用它们的人来说。记住语法并理解各种元字符和规则可能令人望而生畏。
为了让您的正则表达式之旅更加顺畅,我们创建了一个全面的 Python 正则表达式速查表。此速查表用作方便的参考指南,为您提供 Python 正则表达式中最常用元字符、字符类、量词、锚点、组、标志、转义序列和特殊字符的快速概述。
注意− 请记住在您的 Python 脚本中导入 re 模块以使用正则表达式。
常用元字符
元字符是正则表达式中具有特定含义的特殊字符,用于定义模式。理解和使用这些元字符对于有效的模式匹配至关重要。在本节中,我们将探讨 Python 正则表达式中一些最常用的元字符。
点 (.) −点元字符匹配除换行符之外的任何字符。它通常用于表示通配符,允许您匹配给定位置的任何字符。
示例
import re pattern = r"b.ttle" text1 = "bottle" text2 = "battle" text3 = "bottle\n" match1 = re.search(pattern, text1) match2 = re.search(pattern, text2) match3 = re.search(pattern, text3) print(match1) print(match2) print(match3)
输出
<re.Match object; span=(0, 6), match='bottle'> <re.Match object; span=(0, 6), match='battle'> <re.Match object; span=(0, 6), match='bottle'>
在上面的示例中,点元字符 . 用于匹配模式 b.ttle 中的任何字符。它成功匹配了“bottle”和“battle”,但未能匹配“bottle\n”,因为点不匹配换行符。
脱字符 (^) 和美元符号 ($) −脱字符和美元符号元字符分别表示行的开头和结尾。它们用于将模式锚定在行的开头或结尾。
示例
import re pattern1 = r"^Python" pattern2 = r"\d$" text1 = "Python is a powerful language" text2 = "The price is $10" match1 = re.search(pattern1, text1) match2 = re.search(pattern2, text2) print(match1) print(match2)
输出
<re.Match object; span=(0, 6), match='Python'> <re.Match object; span=(15, 16), match='0'>
在上面的示例中,脱字符 ^ 用于将模式“Python”锚定在行的开头,在 text1 中成功匹配它。美元符号 $ 用于将模式 \d(匹配任何数字)锚定在行的末尾,在 text2 中成功匹配数字“0”。
方括号 ([...]) − 方括号用于创建字符类,允许您匹配指定字符集中单个字符。您可以在括号中包含多个字符或范围。
示例
import re pattern = r"[aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
输出
['e', 'o', 'o']
在上面的示例中,模式 [aeiou] 用于匹配文本中的任何元音字符。findall() 函数返回找到的所有匹配项的列表,在本例中为字符“e”、“o”和“o”。
管道符 (|) − 管道字符用作 OR 运算符,允许您匹配左侧或右侧的模式。
示例
import re pattern = r"cat|dog" text = "I have a cat and a dog" match = re.search(pattern, text) print(match)
输出
<re.Match object; span=(9, 12), match='cat'>
在上面的示例中,模式 cat|dog 匹配“cat”或“dog”。search() 函数返回找到的第一个匹配项,在本例中为“cat”。
这些只是 Python 正则表达式中常用元字符的一些示例。在下一节中,我们将探讨字符类和量词,以进一步增强我们的模式匹配能力。
字符类和量词
字符类和量词在定义正则表达式模式时提供了额外的灵活性和控制。在本节中,我们将深入探讨这些功能,并学习如何有效地使用它们。
字符类 − 字符类允许您指定一组可以在模式中特定位置匹配的字符。它们包含在方括号 [ ] 中,并提供了一种方法来匹配定义集中任何单个字符。
示例
import re pattern = r"[aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
输出
['e', 'o', 'o']
在上面的示例中,字符类 [aeiou] 匹配文本中的任何元音字符。findall() 函数返回找到的所有匹配项的列表,在本例中为字符“e”、“o”和“o”。
否定字符类 − 否定字符类允许您匹配定义集中不存在的任何字符。它们通过在字符类的开头包含脱字符 ^ 来表示。
示例
import re pattern = r"[^aeiou]" text = "Hello, World!" matches = re.findall(pattern, text) print(matches)
输出
['H', 'l', 'l', ',', ' ', 'W', 'r', 'l', 'd', '!']
在上面的示例中,否定字符类 [^aeiou] 匹配任何不是元音的字符。findall() 函数返回找到的所有匹配项的列表,其中包括所有辅音字符和标点符号。
量词 − Quantifiers 允许您指定应匹配的模式出现的次数。它们可以应用于单个字符、字符类或模式组 −
− 匹配前一个模式的零次或多次出现。
+ − 匹配前一个模式的一次或多次出现。
? − 匹配前一个模式的零次或一次出现。
{n} − 匹配前一个模式的恰好 n 次出现。
{n,} − 匹配前一个模式的至少 n 次出现。
{n,m} − 匹配前一个模式的 n 到 m 次出现。
示例
import re pattern = r"ab*c" text1 = "ac" text2 = "abc" text3 = "abbbbc" match1 = re.search(pattern, text1) match2 = re.search(pattern, text2) match3 = re.search(pattern, text3) print(match1) print(match2) print(match3)
输出
<re.Match object; span=(0, 2), match='ac'> <re.Match object; span=(0, 3), match='abc'> <re.Match object; span=(0, 6), match='abbbbc'>
在上面的示例中,量词 * 用于匹配模式 ab*c 中字符“b”的零次或多次出现。它成功匹配了“ac”、“abc”和“abbbbc”,因为字符“b”是可选的。
通过组合字符类、否定字符类和量词,您可以创建强大且灵活的正则表达式模式,以匹配给定文本中的各种模式。
在下一节中,我们将探讨 Python 正则表达式更高级的功能,包括捕获组、锚点和前瞻。
捕获组、锚点和前瞻
捕获组、锚点和前瞻是 Python 正则表达式的高级功能,它们提供了对模式匹配的更多控制。在本节中,我们将探讨这些功能,并了解如何有效地使用它们。
捕获组 − 捕获组允许您在更大的模式中定义子模式并提取匹配的内容。它们使用括号 ( ) 定义,并且在您想提取匹配项的特定部分时很有用。
示例
import re
pattern = r"(\d{2})-(\d{2})-(\d{4})"
text = "Date of Birth: 01-23-1990"
match = re.search(pattern, text)
if match:
day = match.group(1)
month = match.group(2)
year = match.group(3)
print(f"Day: {day}, Month: {month}, Year: {year}")
输出
Day: 01, Month: 23, Year: 1990
在上面的示例中,模式 (\d{2})-(\d{2})-(\d{4}) 定义了三个捕获组以匹配日期格式中的日、月和年。search() 函数返回一个匹配对象,并且 group() 方法用于提取匹配的值。输出将为“Day: 01, Month: 23, Year: 1990”。
锚点 − 锚点用于指定文本中应发生匹配的位置。它们不匹配任何字符,而是断言有关周围文本的条件。两个常用的锚点是 ^ 和 $。
^ − 匹配字符串的开头。
$ − 匹配字符串的结尾。
示例
import re
pattern = r"^Python"
text = "Python is a popular programming language"
match = re.search(pattern, text)
if match:
print("Match found!")
else:
print("No match found.")
输出
Match found!
在上面的示例中,模式 ^Python 仅当“Python”出现在文本开头时才匹配该单词。由于文本以“Python”开头,因此找到了匹配项,并打印了相应的邮件。
前瞻断言− 前瞻断言用于指定模式匹配发生时必须满足的条件。它们用 (?=...) 表示正向前瞻断言,用 (?!...) 表示负向前瞻断言。
示例
import re pattern = r"\b\w+(?=ing\b)" text = "Walking is good for health" matches = re.findall(pattern, text) print(matches)
输出
['Walk']
在上面的示例中,模式 \b\w+(?=ing\b) 匹配任何后跟后缀“ing”的单词。正向前瞻断言 (?=ing\b) 断言该单词应后跟“ing”,但它不是实际匹配的一部分。findall() 函数返回所有匹配单词的列表,在本例中为“Walk”。
通过利用捕获组、锚点和前瞻断言,您可以创建更复杂的正则表达式模式,以精确匹配和提取文本中的特定内容。
在下一节中,我们将探讨 Python 正则表达式的其他高级功能,包括反向引用、标志和高级修饰符。
反向引用、标志和高级修饰符
反向引用、标志和高级修饰符是 Python 正则表达式中强大的功能,可以增强模式匹配功能。在本节中,我们将深入探讨这些功能,并学习如何有效地利用它们。
反向引用− 反向引用允许您在模式中引用先前捕获的组。它们用反斜杠 \ 后跟组号或组名表示。当您想要匹配重复模式或确保匹配内容的一致性时,反向引用非常有用。
示例
import re
pattern = r"(\w+)\s+\1"
text = "hello hello"
match = re.search(pattern, text)
if match:
print("Match found!")
else:
print("No match found.")
输出
Match found!
在上面的示例中,模式 (\w+)\s+\1 匹配一个单词后跟一个或多个空格,然后是同一个单词。反向引用 \1 指的是第一个捕获组,它确保重复了同一个单词。由于文本包含“hello hello”,因此找到了匹配项,并打印了相应的提示信息。
标志− 标志修改正则表达式模式匹配的行为。它们用 re 模块常量表示,可以作为可选参数传递给正则表达式函数。一些常用的标志如下:−
re.IGNORECASE − 匹配时忽略大小写。
re.MULTILINE − 启用多行匹配。
re.DOTALL − 允许点 (.) 匹配任何字符,包括换行符。
示例
import re
pattern = r"python"
text = "Python is a popular programming language"
match = re.search(pattern, text, re.IGNORECASE)
if match:
print("Match found!")
else:
print("No match found.")
输出
Match found!
在上面的示例中,模式 python 与文本一起使用 re.IGNORECASE 标志进行匹配。因此,大小写差异被忽略,即使单词“Python”以大写字母开头,也会找到匹配项。
高级修饰符 − 高级修饰符提供了对正则表达式匹配行为的额外控制。它们用放置在正则表达式模式结束分隔符后的特殊字符表示。
? − 使前一个模式可选(匹配 0 次或 1 次)。
− 匹配前一个模式的 0 次或多次出现。
+ − 匹配前一个模式的 1 次或多次出现。
{m} − 精确匹配前一个模式的 m 次出现。
{m, n} − 匹配前一个模式的 m 到 n 次出现。
示例
import re pattern = r"apples?|bananas?" text = "I like apple and bananas" matches = re.findall(pattern, text) print(matches)
输出
['apple', 'bananas']
在上面的示例中,模式 apples?|bananas? 匹配“apple”或“apples”以及“banana”或“bananas”。? 修饰符使前一个字符或组可选,允许匹配水果名称的单数和复数形式。
通过使用反向引用、标志和高级修饰符,您可以创建更灵活和动态的正则表达式模式来处理各种匹配场景。
在下一节中,我们将讨论常见的正则表达式陷阱和最佳实践,以提高您的正则表达式技能。
常见的正则表达式陷阱和最佳实践
虽然正则表达式是用于模式匹配和文本操作的强大工具,但如果使用不当,也可能容易出现陷阱。在本节中,我们将探讨一些常见的陷阱,并提供最佳实践来帮助您避免这些陷阱。
贪婪匹配与非贪婪匹配正则表达式的常见陷阱之一是其贪婪匹配行为,其中模式尽可能多地匹配。这可能导致意外结果,尤其是在使用 * 和 + 等量词时。为了减轻这种情况,您可以使用非贪婪修饰符 *? 和 +? 以尽可能少的匹配。
示例
import re text = "<html><body><h1>Title</h1></body></html>" pattern = r"<.*?>" matches = re.findall(pattern, text) print(matches)
输出
['<html>', '<body>', '<h1>', '</h1>', '</body>', '</html>']
在上面的示例中,模式 <.*?> 匹配 HTML 标签。.*? 非贪婪修饰符确保匹配在 > 的第一次出现时停止。如果没有非贪婪修饰符,匹配将跨越整个文本,包括多个标签。
锚定匹配 − 锚定匹配可以防止在文本中意外位置出现意外匹配。锚点是特殊字符,用于标记行首 (^) 和行尾 ($) 或整个文本。
示例
import re text = "The quick brown fox jumps over the lazy dog." pattern = r"\bfox\b" matches = re.findall(pattern, text) print(matches) # Output: ['fox']
输出
['fox']
在上面的示例中,模式 \bfox\b 将“fox”匹配为整个单词。\b 锚点确保“fox”不会作为另一个单词的一部分进行匹配,例如“foxy”或“foxes”。
复杂的嵌套模式在处理涉及嵌套组的复杂模式时,务必使用命名组和适当的模式组织来提高可读性和可维护性。
示例
import re
text = "Date: 2022-01-01, Time: 12:00 PM"
pattern = r"Date: (?P<date>\d{4}-\d{2}-\d{2}), Time: (?P<time>\d{2}:\d{2} [AP]M)"
match = re.search(pattern, text)
if match:
date = match.group("date")
time = match.group("time")
print(f"Date: {date}, Time: {time}")
输出
Date: 2022-01-01, Time: 12:00 PM
在上面的示例中,模式使用命名组 (?P<name>pattern) 来捕获日期和时间信息。这种方法提高了代码的可读性,并允许使用组名轻松访问捕获的值。
结论
正则表达式是 Python 中用于模式匹配和文本操作的强大工具。通过理解基本语法、元字符和常见的正则表达式技巧,您可以释放处理文本数据的广泛可能性。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP