Python正则表达式初学者指南

如果您是一名程序员,则很有可能已经知道什么是正则表达式(regex)。几乎所有主流编程语言都已实现了正则表达式模式,但是,大多数开发人员尚未意识到这些模式的功能和多功能性。

本指南主要涉及正则表达式以及如何在Python编程语言中使用它们。

什么是正则表达式?

正则表达式是可以帮助用户匹配文本文件和字符串中字符组合的模式。您可以使用正则表达式在命令或文档的输出中过滤或查找特定的模式。

正则表达式有各种用例,最著名的是Linux中的grep命令。其他应用程序包括信息过滤,例如从数据转储中提取电子邮件地址和电话号码。

许多开发人员偏离正则表达式的主要原因是缺乏对模式匹配功能的认识。由于模式中使用了大量的字符和序列,有些人甚至发现正则表达式令人困惑。

无论是什么原因,正则表达式都是并且将成为每个人都应该知道的最重要的编程方面之一。

正则表达式:匹配的字符和序列

正则表达式本身就是一种全新的语言。正则表达式引擎解释由几个具有特定含义的字符组成的模式。基本文字(例如字母数字字符)会相互匹配。但是复杂的字符(例如$,*,+,{等)有助于进行高阶匹配。

  1. 星号(*):匹配前面的字符零次或多次。字符的字面意思是“元素乘以n次”。例如,如果正则表达式为abc * ,则匹配的字符串将为ab,abc,abcc,abccc,abcccc等。表达式[bc] *将与bc,bcbc,bcbc等匹配。
  2. 加号(+):与前面的字符匹配一次或多次。 +字符的工作方式与*相似,但是+字符会在没有出现字符的情况下忽略该模式。例如, abc +将匹配abc,abcc,abccc等,但不匹配ab。
  3. 问号(?):匹配前面的字符零或一次。例如,模式abc?仅匹配ab和abc。
  4. 管道(|):用作二进制OR运算符。匹配管道前后的任何一个字符。例如, a | b将匹配a或b。
  5. 点(。):匹配身份未知的字符。例如, ac将匹配aac,abc,acc,a2c等。
  6. 胡萝卜(^):匹配模式中的第一个字符。例如, ^ Ra将匹配以Ra开头的单词,例如Rabbit,Raccoon和Random。
  7. 美元($):匹配模式中的最后一个字符。例如,$将匹配诸如凡丹,以及计划结尾的单词。
  8. 连字符(-):用于定义字符范围。例如, [0-9]将匹配所有一位数字字符。

正则表达式模式中使用的特殊序列是:

  1. A:如果字符串的开头存在后续字符,则返回匹配项。例如, AThe将匹配以The开头的单词例如The,Them,它们等。
  2. b:如果在单词的开头或结尾找到字符,则返回匹配项。例如, bmadmad b将分别匹配诸如madenomad之类的词。
  3. B:如果在单词的开头或结尾找不到字符,则返回匹配项。
  4. d:匹配字符串中存在的数字字符。例如, / d *将匹配数字,例如1、12、1232等。
  5. D:匹配字符串中的非数字字符。 / D将匹配a,b,c,f等
  6. s:匹配文本中的空白字符。
  7. S:与文本中的非空白字符匹配。
  8. w:如果字符串包含字母数字字符(包括下划线),则返回匹配项。例如, w将匹配a,b,c,d,1、2、3等。
  9. W:如果字符串不包含字母数字字符或下划线,则返回匹配项。
  10. Z:匹配字符串末尾的字符。例如, end Z将匹配以end结尾的单词,例如弯曲,修补,趋向等。

正则表达式的Python方法

在Python中, re库提供了在程序中实现正则表达式所需的所有必要功能和实用程序。您无需使用pip下载该库,因为该库已预先安装了Python解释器。

要在Python中导入re库,请在脚本中添加以下代码:

 import re

请注意,在Python中传递正则表达式时,我们使用原始字符串,因为它们不会以不同的方式解释特殊字符(例如 n t)

比赛()

如果程序在指定字符串的开头找到匹配项,则Python中的re.match()方法将返回一个regex对象。此函数有两个基本参数:

 re.match(pattern, string)

…其中pattern是正则表达式, string是需要搜索的文本。

看看下面的代码片段。

 import re
match = re.match(r'Word', "This sentence contains a Word")
print(match)

字符串前的r字符代表原始字符串。

输出:

 None

前面提到的代码返回None,因为在字符串的开头没有出现Word

如果找到匹配项,则可以使用属于正则表达式对象的group()方法来打印匹配项。

 import re
match = re.match(r'Word', "Word is hard to read")
print(match.group(0))

输出:

 Word

re.search()方法采用与re.match()类似的参数。尽管match()仅返回出现在字符串开头的匹配项,但search()将返回在字符串的任何索引处找到的匹配项。

 import re
match = re.search(r'Word', "This sentence contains a Word. Word is hard to read.")
print(match.group(0))

请注意match()search()方法将仅返回一个模式匹配。在上述代码中, Word出现了两次。但是search()函数将仅匹配单词的第一个匹配项。

 Word

找到所有()

您已经猜到了, findall()方法返回字符串中所有可能的匹配项。

 import re
match = re.search(r'Word', "This sentence contains a Word. Word is hard to read.")
for elem in match:
print(elem)

findall()函数将返回所有匹配项的列表,而不是返回正则表达式对象。您可以使用python中for循环遍历列表。

分裂()

如果要使用模式作为分隔符将字符串拆分为子字符串,则split()函数是您所需要的。

 import re
split = re.split(r'and', "This word and that and this are different.")
print(split)

输出:

 ['This word", "that", "this are different."]

子()

sub()方法允许用户替换模式中的特定单词。它采用以下参数。

 re.sub(pattern, replacement, string)

考虑以下代码片段:

 import re
result = re.sub(r'and', 'or', "Dave and Harry must be punished.")
print(result)

输出:

 Dave or Harry must be punished.

编译()

re库中的re.compile()方法允许用户将正则表达式模式的编译版本存储在内存中。然后,使用编译的对象,用户可以快速为匹配的模式过滤指定的文本转储。

 import re
pattern = re.compile('Python')
match = pattern.findall("Python is a great language for writing scripts. Python is easy to learn.")
print(match)

此功能主要用于保存资源密集型且需要大量时间才能运行的模式。事先将模式编译并保存为对象可以解决此问题。

利用Python发挥正则表达式的功能

当您处理文本文件和输出时,正则表达式是一个很好的工具供您使用。您可以快速编写一些代码来过滤或替换文档中的特定模式。

如果刚开始使用正则表达式,则很难记住所有字符和匹配序列。为了更好地掌握正则表达式,从长远来看,时不时地参考一系列字符,方法和序列肯定会为您提供帮助。