Python正则表达式与模式匹配

Python Training
python
regular expression
pattern matching
Author
Published

Saturday, January 18, 2020

很多商业分析都依赖模式匹配,也称为正则表达式(regular expression)。举例来说,我们可能需要分析一下来自深圳的所有订单。此时,你需要识别的模式就是“深圳”这个词。同样,你可能需要分析来自某个供应商的商品质量,此时你要识别的模式就是供应商的名字。

Python包含了re模块,它提供了在文本中搜索特定模式/正则表达式的强大功能。要在脚本中使用re模块提供的功能,我们需要在脚本上方加入代码import re。

导入re模块后,可以使用一大波函数和元字符来创建和搜索任意复杂的模式。元字符(metacharacter)是正则表达式中具有特殊意义的字符,使正则表达式能够匹配特定的字符串。

常用的元字符包括 |、()、[]、.、*、+、?、^、$和(?P<name>)。如果你在正则表达式中见到这些字符,要知道程序不是要搜索这些字符本身,而是要搜索它们要描述的东西。

re模块包含了很多有用的函数,用于创建和搜索特定的模式。一起来看一个示例代码:

sample code

第一行赋值字符串变量string,下一行将字符串拆分为列表,列表中的每个元素都是一个单词。使用re.compile和re.I函数以及用r表示的原始字符串,创建一个名为pattern的正则表达式。re.compile函数将文本形式的模式编译成为正则表达式(正则表达式不是必须编译的,但编译是个好习惯,因为这样可以显著地提高程序运行速度),re.I函数确保模式是不区分大小写的,即能同时在字符串中匹配“The”和“the”,原始字符串标志r可确保Python不处理字符串中的转义字符(如、),这样在进行模式匹配是,字符串中的转义字符和正则表达式中的元字符就不会有意外的冲突。利用for循环在列表变量sring_list的各个元素之间进行迭代,取出列表中所有的单词,使用re.search函数将每个单词与正则表达式进行比较,如果相匹配,那么count的值就加1。print语句打印出正则表达式在字符串汇总找到模式“The”(不区分大小写)的次数。

再看另一个示例:

sample code 2

这个示例想要打印出相匹配的字符串,而不是相匹配的次数,这里使用到了(?P<name>)元字符和group函数。(?P<name>)元字符使匹配的字符串可以在后面的程序中通过组名符号name来引用,这里称为match_word。后面if语句中使用了group函数获取分段截获的字符串,如果相匹配,那么就在search函数返回的数据结构中找出match_word组合中的值,并打印出来。

最后一个示例:

sample code 3

我们演示了使用re.sub函数在文本中用一种模式替换另一种模式。将正则表达式赋给变量string_to_find不是必需的,但若正则表达式特别长或复杂的话,将它赋给一个变量,然后传入re.compile函数有助于理解。最后使用re.sub函数以不区分大小写的方式在变量string中寻找模式,将发现的每个模式替换成a。