正则表达式

2024 年 8 月 29 日 | 阅读 6 分钟

正则表达式(通常称为 regex 或 RegEx)是一系列定义搜索模式的字符。它们用于在字符串中匹配模式并对它们执行各种操作,如替换、提取或拆分。

RegEx 是强大的文本处理工具,在 Python、Java、C#、Perl、JavaScript 等许多编程语言中广泛使用。它是开发人员需要理解和掌握的重要概念,因为它可以简化许多文本处理任务,使代码更简洁易读。

正则表达式的语法起初可能看起来令人困惑,但经过一些练习,它会变得更容易理解和使用。RegEx 中有几个具有特殊含义的特殊字符,例如点 (.)、星号 (*)、问号 (?)、加号 (+) 等。这些特殊字符称为元字符,它们的含义取决于它们使用的上下文。

正则表达式最常见的用途之一是在字符串中搜索特定模式。RegEx 模式被定义为字符串,并通过 match() 方法应用于字符串。如果检测到模式,该方法将生成一个匹配对象;否则,它返回 None。

例如,以下代码使用正则表达式在字符串中查找单词“dog”

输出

Match found.

RegEx 广泛用于查找和更改字符串中的文本。使用 sub() 方法替换字符串中模式的每个实例。

例如,下面的代码将所有出现的单词“dog”更改为“cat”

上述代码的输出将是

The cat is barking. The cat is sleeping.

RegEx 还可以将字符串分割成子字符串数组。使用模式,split() 方法可以将文本分割成子字符串数组。

例如,下面的代码根据空格将文本分割成单词数组

上述代码的输出将是

['The', 'dog', 'is', 'barking.']

RegEx 也可用于验证用户输入。例如,您可以使用 RegEx 来验证电子邮件地址、电话号码或邮政编码。这在 Web 应用程序中是一个常见的用例,其中用户输入通常会进行验证,以确保它符合某些标准。

例如,以下代码使用正则表达式验证电子邮件地址

上述代码的输出将是

Valid email address.

RegEx 的另一个常见用途是从字符串中提取信息。例如,您可以使用 RegEx 从完整姓名字符串中提取名字和姓氏。

例如,以下代码使用正则表达式从完整姓名字符串中提取名字和姓氏

上述代码的输出将是

First name: John
Last name: Doe

输出

Start Index: 34
End Index: 40

上面的代码提供了字符串 portal 的起始索引和结束索引。

此实例中的 r 字符 (r'portal') 表示原始数据,而不是 regex。在原始字符串中,该字符不会被识别为转义字符,使其与标准字符串略有不同。这是因为模式匹配引擎将该字符用于内部转义。

RegEx 中的元字符

元字符是在正则表达式模式中具有特殊含义的字符。它们用于定义要匹配的模式,而不是匹配字符本身。这些是最受欢迎的一些元字符。 (点) 匹配任何单个字符,但不匹配换行符。

星号 (*): 匹配其前面的字符或组的零次或多次出现。例如,a* 匹配字母“a”的零次或多次出现。

加号 (+) 表示给定的字符或组出现一次或多次。例如,a+ 匹配字母“a”的一次或多次出现。

问号 (?) 匹配其前面的字符或组的零次或一次出现。例如,a? 匹配字母“a”的零次或一次出现。

插入符号 (^) 表示一行或字符串的开头。例如,a 匹配一行或字符串开头的字母“a”。

美元符号 ($) 表示一行或字符串的结束。例如,a$ 匹配结尾处的“a”。

匹配前面字符或组的指定次数(在花括号中)。例如,a3 匹配字母“a”的精确三次出现。

[] (方括号) 匹配字符组中的一个字符。例如,[abc] 匹配“a”、“b”或“c”。

| (竖线) 符号匹配竖线之前的表达式或之后的表达式。例如,A|b 匹配“a”或“b”。

\ (反斜杠): 转义下一个字符。例如,\* 匹配星号字符本身,而不是匹配前一个字符的零次或多次出现。为了确保该字符不被赋予特殊处理,请使用反斜杠 (/)。这可以看作是元字符转义。例如,如果要搜索字符串中的点 (.)(如上表所示),则点 (.) 将被视为特殊字符和元字符之一。为了防止它失去其特殊性,在这种情况下,我们将在点 (.) 前面使用反斜杠 (/)。

() (括号): 定义一个组。例如,(a|b) 匹配“a”或“b”。

[] (方括号) 匹配字符组中的一个字符。例如,[abc] 匹配“a”、“b”或“c”。

方括号 [] 中的插入符号匹配不在字符组中的字符。例如,[abc] 匹配除“a”、“b”和“c”之外的所有字符。

d 匹配任何数字。类似于 [0-9]。

D: 匹配任何非数字字符。类似于 [0-9]。

w: 匹配单词中的任何字符。相当于 [a-zA-Z0-9_]。

W: 匹配任何非单词字符。类似于 [a-zA-Z0-9] 。

s 匹配任何空白字符。相当于 [tnrfv]。

\S: 匹配任何非空白字符。等同于 [^ \t\n\r\f\v]。

正则表达式广泛用于 Perl、Python、Ruby、JavaScript 和 grep 等许多编程语言和工具中。它们对于文本处理任务特别有用,例如模式匹配、字符串操作和数据提取。

以下是正则表达式的一些常见用例

验证:通过将其与模式进行比较,正则表达式可以验证用户输入,如电子邮件地址、电话号码和密码。

搜索和替换:正则表达式可用于在字符串中搜索模式并将其替换为另一个字符串。这对于删除不需要的字符、格式化文本或用实际值替换占位符等任务非常有用。

数据提取:正则表达式可用于从字符串中提取特定数据,例如提取数字、日期或 URL。数据抓取、解析日志文件或从文本文档中获取数据等任务都可以从中受益。

文本操作:正则表达式可用于以各种方式操作文本,例如将字符串分割成单独的单词、删除重复项或将文本转换为不同的大小写。

需要注意的是,虽然正则表达式非常强大,但它们也可能很复杂,并且难以阅读和维护,尤其是在处理复杂模式时。最好尽可能使用简单清晰的模式,并在生产环境中使用正则表达式之前对其进行彻底测试。

总之,正则表达式是用于文本处理的强大工具,可以简化许多文本处理任务,并使代码更简洁易读。它们在许多编程语言中得到广泛应用,并有许多应用,包括搜索、替换、拆分、验证用户输入和提取信息。虽然正则表达式的语法起初可能看起来令人困惑,但经过练习,它会变得更容易理解和使用。