Python 正则表达式

正则表达式是什么?

在日常工作中,我们可能会使用到 Word 的一个功能,那就是使用 “Ctrl+F” 快捷键来快速查找某个字符串。Word 之所以能够匹配符合条件的字符串,其实就是使用正则表达式来实现的。

正则表达式,全称 “Regular Expression”,在代码中常简写为 regex 或 re。正则表达式,指的是用某种模式去匹配一类字符串的公式。学习正则表达式,说白了就是学习各种匹配语法,例如想要匹配数字应该怎么写、匹配字符串应该怎么写,等等。

再来举一个非常有用的例子。大多数网站都有注册登录功能(如下图所示),表单中都有相应的验证功能。例如邮箱必须符合 “xxx@xxx” 格式,手机号要求全部是数字,密码要求不少于 6 个字符等。那么程序是怎么判断用户输入的内容是否符合相应表单要求的呢?这就需要用到正则表达式了。

Python 正则表达式

在表单中,我们可以定义一种 “模式”,如果用户输入的内容符合这种模式,就通过。如果用户输入的内容不符合这种模式,就不通过。这种所谓的模式,指的就是 “正则表达式”。

正则表达式一般需要两部分的内容:一是 “被验证的字符串”,二是 “正则表达式”。我们可以把 “被验证的字符串” 比喻成 “等待检验的产品”,把 “正则表达式” 比喻成 “校验工厂”。产品在生产流水线检查时,合格的就通过,不合格的就扔掉,如下图所示。这样去比喻,相信应该很好理解了吧?

Python 正则表达式就像生产流水线

Python 使用正则表达式

在 Python 中,我们可以引入 re 模块来使用正则表达式。

语法:

import re
re.findall(pattern, string)

说明:

findall() 函数用于查找字符串中符合条件的部分。findall() 函数有两个参数:pattern 是一个正则表达式;str 是一个字符串。

findall() 函数会返回一个列表,该列表存放的是所有符合条件的子字符串。

示例:正则表达式的基本用法

import re

result = re.findall(r'\d\d\d-\d\d\d\d\d\d', 'My number is 020-666666 or 020-888888')
print(result)

运行结果如下:

['020-666666', '020-888888']

分析:

r'\d\d\d-\d\d\d\d\d\d' 是一个原始字符串,这个原始字符串其实就是我们所说的正则表达式。每一个 \d 表示匹配一个数字,也就是说只有符合 “xxx-xxxxxx” 格式的数字字符串,才满足匹配条件。

当然了,如果正则表达式或字符串太长,则还可以分开来定义,修改后的代码如下。

import re

pattern = r'\d\d\d-\d\d\d\d\d\d'
s = 'My number is 020-666666 or 020-888888'
result = re.findall(pattern, s)

print(result)

虽然我们可以用 result[0] 来获取第一个匹配的值,但这里隐藏着一个巨大的坑!如果正则表达式没有在字符串中找到任何内容,那么 findall() 会返回一个空列表 []。此时去取第 0 个元素,程序就会直接报错崩溃(IndexError)。

实际上,最安全的做法是:在提取之前,先判断一下列表是否为空,比如:

import re

pattern = r'\d\d\d-\d\d\d\d\d\d'
s = 'My number is 020-666666 or 020-888888'

result = re.findall(pattern, s)
# 先判断 result 中是否有数据,防止空列表报错
if result:
    print('找到了:', result[0])
else:
    print('没有匹配到任何内容')

最后小伙伴们要记住一点,使用正则表达式,我们都需要提供两部分内容:(1)正则表达式;(2)被验证的字符串。

上一篇: Python 多线程

下一篇: Python 字符串转数字

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号