正则表达式,通常称为 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() 函数返回找到的所有匹配项的列表,其中包括所有辅音字符和标点符号。
量词− Q量词允许您指定应匹配的模式出现的次数。它们可以应用于单个字符、字符类或模式组−
− 匹配零次或多次出现的前述模式。
+ − 匹配前面模式的一次或多次出现。
? - 匹配前面的模式出现零次或一次。
{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()方法用于提取匹配的值。输出将为“日:01,月:23,年: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
正则表达式是 Python 中模式匹配和文本操作的强大工具。通过了解基本语法、元字符和常见的正则表达式技术,您可以解锁处理文本数据的各种可能性。
The above is the detailed content of Python regular expression cheat sheet. For more information, please follow other related articles on the PHP Chinese website!