上节课讲了批量电子邮件的发送。 image.png 上节课结束后,使用 Python 发送电子邮件的办公自动化告一段落了。从本节课我们开始讲解正则表达式。

在工作中,我们时常会有从大量的文本中搜索特定文本的需求,如果需要搜索的特定文本是固定的字符串,一般的文本编辑器都支持这种查找,使用文本编辑器便可以高效的查找出我们想要的字符串。有些情况下要查找的字符串不是固定的,而是符合某种组成规则的。这时候使用文本编辑器来进行查找便无能为力了。这时候我们可以用编写 Python 代码的方式来进行查找,使用代码来表达字符串的组成规则。下面我们就来举一个使用代码查找字符串的例子。

假设我们要从一段文本中查找 123-456-7890 形式的电话号码。此种形式的电话号码组成规则是,前三个字符为数字,后面紧接着一个分隔符-,后面接着是三个数字,再接着是分隔符-,最后是四位数字。下面我们就用 Python 代码来实现这种组成规则的字符串的查找。

# 1.不使用正则表达式

不使用正则表达式的代码如下:

def is_phone_number(text):
    if len(text) != 12:
        return False
    for i in range(0, 3):
        if not text[i].isdecimal():
            return False
    if text[3] != '-':
        return False
    for i in range(4, 7):
        if not text[i].isdecimal():
            return False
    if text[7] != '-':
        return False
    for i in range(8, 12):
        if not text[i].isdecimal():
            return False
    return True

message = 'My number is 415-555-4242.'

for i in range(len(message)):
    chunk = message[i:i+12]
    if is_phone_number(chunk):
        print('Phone number found: ' + chunk)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

上面的代码中,首先定义一个 is_phone_number 函数,此函数描述了电话号码的组成规则。接着我们对要查找的字符串遍历,遍历时从前往后每次取 12 字符,调用 is_phone_number 函数对这 12 字符进行判断。一次判断结束后,往后推移一个字符,接着进行判断。直到余下的字符串中的字符个数不足 12 个。这种通过代码来查找符合某种组成规则的字符串的方法有很大的局限性,当字符串的组成规则稍微变动时,整个代码都需要推到重来。例如,如果要查找的电话号码的形式变为:(123)-456-7890,这时候我们便要重写代码。显然这种查找方式不是很灵活。下面我们来看下使用正则表达式如何来查找符合某种组成规则的字符串。

# 2.使用正则表达式

正则表达式出现的目的就是为了更加灵活方便地描述字符串的组成规则。

# 2.1 步骤

使用正则表达式查找字符串的步骤如下:

1.使用 import re 导入正则模块。 2.调用 rearch 方法来匹配字符串,第一个参数为规则,第二个参数为要匹配的字符串。 3.调用 group() 方法来获取匹配的字符串。

# 2.2 使用普通字符组

下面使用正则表达式来查找上面例子中的电话号码,代码如下:

import re

mo = re.search(r"[0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]", "My number is 415-555-4242")

print('Phone number found: ' + mo.group())
1
2
3
4
5

在代码中,[0123456789] 为字符组,字符组就是在某个位置可能出现的所有字符的集合。[0123456789] 表示在这个位置上可能出现0 ~ 9 这 10 个数字中的任何一个。

我们可以看到使用正则表达式可以更简洁地描述要查找字符串的组成规则。

# 3.小结

image.png

更新于: 12/30/2021, 2:46:39 AM