Python 正则表达式元字符


正则表达式,通常称为 regex,是 Python 中用于模式匹配和文本操作的强大工具。它们允许您定义模式并在字符串中搜索匹配项,这使得它们在各种应用程序(如数据验证、文本处理和网络爬虫)中非常有用。

在正则表达式中,元字符起着至关重要的作用。这些特殊字符具有预定义的含义,用于构建复杂的模式。有效地理解和利用元字符可以显著增强您的正则表达式技能。

在本文中,我们将探索 Python 正则表达式元字符的世界。我们将学习不同的元字符以及如何使用它们来构建强大的正则表达式模式。

Python 正则表达式元字符的类型

Python 正则表达式中的元字符是具有预定义含义的特殊字符。它们允许您创建复杂的模式以匹配字符串中特定字符序列。在本节中,我们将探讨不同类型的元字符及其在 Python 正则表达式中的用法。

锚点

锚点是允许您指定模式在字符串中位置的元字符。它们本身不匹配任何字符,但定义匹配应该发生的位置。以下是常用的锚点元字符:

  • • ^ (脱字符)  匹配字符串的开头。它确保跟随脱字符的模式仅在字符串开头找到。例如,正则表达式 ^Hello 仅当 "Hello" 出现在字符串开头时才会匹配。

示例

import re

string = "Hello, World!"
pattern = "^Hello"

match = re.search(pattern, string)
if match:
   print("Match found!")
else:
   print("No match found.")

输出

Match found!
  • $ (美元符号)  匹配字符串的结尾。它确保在美元符号之前的模式仅在字符串结尾找到。例如,正则表达式 World!$ 仅当 "World!" 出现在字符串结尾时才会匹配。

示例

import re

string = "Hello, World!"
pattern = "World!$"

match = re.search(pattern, string)
if match:
    print("Match found!")
else:
    print("No match found.")

输出

Match found!
  • \b (单词边界)  匹配单词开头或结尾处的空字符串。它用于在较大的字符串中查找整个单词。例如,正则表达式 \bPython\b 仅当 "Python" 作为整个单词出现时才会匹配。

示例

import re

string = "I love Python programming language."
pattern = r"\bPython\b"

match = re.search(pattern, string)
if match:
    print("Match found!")
else:
    print("No match found.")

输出

Match found!

字符类

字符类是匹配指定字符集中的单个字符的元字符。它们包含在方括号 [] 中。以下是一些字符类的示例:

  • [abc]  匹配 a、b 或 c。

  • [0-9]  匹配 0 到 9 之间的任何数字。

  • [a-z]  匹配 a 到 z 之间的任何小写字母。

让我们来看几个例子。

匹配单个字符

在字符类内部,您可以指定要匹配的单个字符。例如,模式 [aeiou] 将匹配任何单个小写元音。

示例

import re

string = "Hello, World!"
pattern = "[aeiou]"

matches = re.findall(pattern, string)
print(matches)

输出

['e', 'o', 'o']

在此示例中,正则表达式 [aeiou] 匹配字符串中所有小写元音的出现。

字符范围

字符范围允许您指定要匹配的字符范围。无需单独列出每个字符,您可以使用连字符 - 定义范围。例如,模式 [a-z] 匹配任何小写字母。

示例

import re

string = "Hello, World!"
pattern = "[a-z]"

matches = re.findall(pattern, string)
print(matches)

输出

['e', 'l', 'l', 'o', 'o', 'r', 'l', 'd']

在这种情况下,正则表达式 [a-z] 匹配字符串中的所有小写字母。

否定字符类

您可以通过在字符类开头使用脱字符 ^ 符号来否定字符类。它将匹配不在指定类中的任何字符。例如,模式 [^aeiou] 匹配任何不是小写元音的字符。

示例

import re

string = "Hello, World!"
pattern = "[^aeiou]"

matches = re.findall(pattern, string)
print(matches)

输出

['H', 'l', 'l', ',', ' ', 'W', 'r', 'l', 'd', '!']

在此示例中,正则表达式 [^aeiou] 匹配字符串中所有不是小写元音的字符。

量词

量词是指定前一个模式应该出现多少次的元字符。它们控制字符或字符组的重复。以下是一些常用的量词:

  • *  匹配前一个模式零次或多次。

  • +  匹配前一个模式一次或多次。

  • ?  匹配前一个模式零次或一次。

  • {n}  匹配前一个模式正好 n 次。

  • {n, m}  匹配前一个模式至少 n 次,至多 m 次。

让我们来了解一些这些方面的实践示例。

星号 (*) - 零次或多次出现

星号 * 量词匹配前一个模式零次或多次出现。它通过考虑可能不出现或多次出现的模式来提供灵活性。

示例

import re

string = "Hellooo, Python!"
pattern = "o*"

matches = re.findall(pattern, string)
print(matches)

输出

['', '', '', '', 'ooo', '', '', '', '', '', '', 'o', '', '', '']

在此示例中,正则表达式 o* 匹配字符串中字母 "o" 的所有出现,包括零次出现。

加号 (+) - 一次或多次出现

加号 + 量词匹配前一个模式一次或多次出现。它确保模式至少出现一次,但允许额外的重复。

示例

import re

string = "Hellooo, Python!"
pattern = "o+"

matches = re.findall(pattern, string)
print(matches)

输出

['ooo', 'o']

在这种情况下,正则表达式 o+ 匹配字符串中字母 "o" 的所有出现,但前提是它出现一次或多次。

问号 (?) - 零次或一次出现

问号 ? 量词匹配前一个模式零次或一次出现。在处理可选模式时,它允许灵活性。

示例

import re

string = "Hellooo, Python!"
pattern = "lo?"

matches = re.findall(pattern, string)
print(matches)

输出

['l', 'lo']

这里,正则表达式 lo? 匹配字符串中的 "lo" 和 "l"。 "o" 是可选的,可能存在也可能不存在。

花括号 ({m,n}) - 特定范围的出现次数

花括号 {m,n} 允许您为前一个模式指定特定范围的出现次数。出现次数的最小值是 m,最大值是 n。如果省略 n,则表示无限次出现。

示例

import re

string = "Hellooo, Python!"
pattern = "o{2,3}"

matches = re.findall(pattern, string)
print(matches)

输出

['ooo']

在此示例中,正则表达式 o{2,3} 匹配字母 "o" 的所有连续出现 2 到 3 次的出现。

分组和捕获

分组元字符允许您在模式中创建子组。它们用圆括号 () 表示。分组有多种用途,例如将量词应用于组、捕获匹配文本的一部分或创建稍后使用的反向引用。

示例

以下是一个快速示例:

import re

string = "John Doe, 25 years old"
pattern = r"(\w+) (\w+), (\d+) years old"

matches = re.findall(pattern, string)
print(matches)  # Output: [('John', 'Doe', '25')]

输出

[('John', 'Doe', '25')]

在此示例中,正则表达式 (\w+) (\w+), (\d+) years old 定义了三个捕获组。第一个组捕获名字,第二个组捕获姓氏,第三个组捕获年龄。findall() 函数返回一个包含匹配组的元组列表。

示例

您可以使用索引或解包访问捕获的组:

for match in matches:
    first_name, last_name, age = match
    print(f"Name: {first_name} {last_name}, Age: {age}")

输出

Name: John Doe, Age: 25

替换

替换元字符 | 允许您指定备选模式。它匹配左侧的模式或右侧的模式。当您希望在特定位置匹配多种可能性时,它非常有用。

让我们看一些例子来了解它是如何工作的。

替换单词

示例

import re

string = "cat hat mat"
pattern = r"cat|hat|mat"

matches = re.findall(pattern, string)
print(matches)

输出

['cat', 'hat', 'mat']

在此示例中,正则表达式模式 cat|hat|mat 匹配给定字符串中 "cat"、"hat" 或 "mat" 的任何出现。| 符号充当逻辑 OR,允许指定多个备选方案。

替换数字

示例

import re

string = "I have 5 dogs and 3 cats"
pattern = r"\d+ dogs?|\d+ cats?"

matches = re.findall(pattern, string)
print(matches)

输出

['5 dogs', '3 cats']

在这个示例中,正则表达式模式 \d+ dogs?|\d+ cats? 匹配一个数字后跟“dogs”或一个数字后跟“cats”。? 量词使前面的“s”可选,允许单数和复数形式。

交替的电子邮件域名

示例

import re

string = "[email protected], [email protected], [email protected]"
pattern = r"\w+@(example|gmail|outlook)\.com"

matches = re.findall(pattern, string)
print(matches)  # Output: ['example', 'gmail', 'outlook']

输出

['example', 'gmail', 'outlook']

在这个示例中,正则表达式模式 \w+@(example|gmail|outlook)\.com 匹配域名分别为“example.com”、“gmail.com”或“outlook.com”的电子邮件地址。括号 () 将备选方案组合在一起,并且需要转义 . 以匹配字面上的点。

转义序列

转义序列允许您将元字符匹配为字面字符。它们由反斜杠 \ 后跟一个元字符表示。例如,要匹配字面上的点 .,您需要将其转义为 \。

让我们探索一些常见的转义序列及其用法。

匹配字面上的点

要匹配字面上的点字符 (.),它在正则表达式中具有特殊含义,您需要使用反斜杠 \ 对其进行转义。

示例

import re

string = "The price is $5.99."
pattern = r"\$5\.99"

matches = re.findall(pattern, string)
print(matches)  # Output: ['$5.99']

输出

['$5.99']

在这个示例中,正则表达式模式 \$5\.99 匹配确切的字符串“$5.99”。美元符号 $ 和点 . 使用反斜杠进行转义,以将其视为字面字符。

匹配特殊字符

某些字符在正则表达式中具有特殊含义,例如 *、+、?、{}、()、[]、^、\$、| 和 \。要将这些字符匹配为字面字符,您需要使用反斜杠 \ 对其进行转义。

示例

import re

string = "The question is: 3 + 4 = ?"
pattern = r"3 \+ 4 = \?"

matches = re.findall(pattern, string)
print(matches)

输出

['3 + 4 = ?']

在这个示例中,正则表达式模式 3 \+ 4 = \? 匹配确切的字符串“3 + 4 = ?”。加号 + 和问号 ? 使用反斜杠进行转义,以将其视为字面字符。

匹配空格字符

空格字符(如空格、制表符和换行符)也可以使用转义序列进行匹配。一些常用的空格转义序列包括 \s 用于任何空格字符,\t 用于制表符,\n 用于换行符。

示例

import re

string = "Hello\tWorld\nPython Regex"
pattern = r"Hello\sWorld\nPython\sRegex"

matches = re.findall(pattern, string)
print(matches)

输出

['Hello\tWorld\nPython Regex']

在这个示例中,正则表达式模式 Hello\sWorld\nPython\sRegex 匹配确切的字符串“Hello\tWorld\nPython Regex”。转义序列 \s、\t 和 \n 分别用于表示空格、制表符和换行符。

结论

了解正则表达式中的转义序列对于有效匹配特殊字符并将它们视为字面字符至关重要。通过使用反斜杠转义这些字符,您可以确保它们被逐字解释,而不是触发其特殊含义。这使您可以搜索包含特殊字符的特定模式,而不会无意中修改正则表达式的行为。

在本文中,我们探讨了各种转义序列,例如转义点字符以匹配字面上的点,转义 + 和 ? 等特殊字符,以及使用空格字符的转义序列。这些示例展示了转义序列在正则表达式中的重要性以及如何利用它们来实现准确的模式匹配。

更新于: 2023年8月10日

654 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告