30天学习Python👨💻第十九天——正则表达式
正则表达式
正则表达式(Regex/RegExp)是一个非常强大的编程概念,适用于所有的编程语言,但却经常让初学者感到疑惑和难以理解。正则表达式是一组字符模式,可以非常有效的对字符串进行检索。它们在处理文本(如搜索、验证或替换文本)时提供了广泛的用例。
今天我将探索在Python中如何使用正则表达式。
正则表达式(缩写为regex或者regexp,也称作理性表达式)是一组定义检索模型的字符。通常此类模型被搜索算法用于对字符串进行检索或者检索并替换,也或者进行输入验证。它是理论计算机科学和形式语言理论发展起来的一种技术。(维基百科)
得益于我之前写JavaScript程序的经验,我已经熟悉了正则表达式。同时,在网络上有大量关于正则表达式的资料。我今天的目标是检查Python中使用正则表达式的语法和方法,因为知道如何在Python中使用正则表达式,对后面构建项目非常有用。因此在这篇文章中我汇集了一些很棒的关于正则表达式的文章以及一些实用的编码练习,作为我在未来使用时的参考。它对正则表达式的爱好者也很有用。不需要记住每一个正则表达式的规则,当需要的时候用谷歌搜索就可以了,绝不多数的正则表达式模式都能够找得到,所以大多数时候我们不需要自己创建正则表达式模式。
但是,知道如何阅读正则表达式模式是一种非常有用的技能,它能帮助我们理解模式的基本功能。
下面是一些专用于Python的正则表达式的资源
- This is a Python RegEx cheatsheet with examples
- A web cheat-sheet
- Another compact web-based cheat-sheet
Regex101 是练习和测试的一个非常好的网站,它还可以生成等价的Python的正则表达式模式
Python中正则表达的方法
为了使用Python中的正则表达式,需要导入一个内置的re模块。这个模块提供了一些使用正则表达式的方法。
| 函数 | 描述 |
|---|---|
| re.search | 检查给定的模式是否存在于输入字符串的任何位置 |
| 输出是一个re.Match对象,可用于条件表达式 | |
| r-strings首选定义正则表达式 | |
| Python还维护了一个正则表达式的小缓存 | |
| re.fullmatch | 确保pattern匹配整个输入字符串 |
| re.compile | 编译一个可重用的模式,输出re.Pattern对象 |
| re.sub | 搜索和替换 |
| re.sub(r'pat', f, s) | 函数f使用re.Match对象作为参数 |
| re.escape | 自动转义所有元字符 |
| re.split | 按照能够匹配的子串将字符串分割后返回列表 |
| 组匹配的文本将作为输出的一部分 | |
| 组外模式匹配的部分不会在输出中 | |
| re.findall | 以列表的形式返回所有匹配项 |
| 如果使用1个捕获组,则只返回匹配的捕获组 | |
| 超过一个捕获组时,每个元素将是捕获组的元组 | |
| 组外模式匹配的部分不会在输出中 | |
| re.finditer | 对于每个匹配,使用re.Match对象的迭代器 |
| re.subn | 给出了修改字符串的元组和替换的数量 |
代码练习
让我们尝试构建一些代码,在构建Python应用程序时测试regex的各种实际用例。
密码验证
# 提示用户输入密码并进行确认
# 条件:
# 最少8个字符
# 只允许使用字母、数字和@$!%*?&
# 至少有一个大写字母
# 至少有一个小写字母
# 至少有一个特殊字符
# 至少有一个数字
import re
def password_checker():
password = input('Please enter a password')
password_pattern = re.compile(
r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$"
)
result = re.fullmatch(password_pattern, password)
if result:
print('Valid password')
else:
print('Invalid password')
password_checker()
注意:上面的代码使用switch会更具交互性,可以单独的检查每一个 条件,并且任何条件失败时显示单独的错误。如果上面的正则表达式看起来很困惑,尝试复制到 regex101试一下。它将把正则表达式分解为多个块并进行解释。
我更喜欢使用compile方法来将正则表达式模式作为一个引用存储,这样它可以后面再执行。它返回一个正则表达式对象。
正则表达式字符串前的r告诉编译器这是一个原始字符串。使用原始字符串时,不需要进行字符转义。
从一个字符串中提取数字
# 这段程序是从字符串中提取数字
import re
string = 'Python was introduced in 1992. This is year 2020.'
pattern = '\d+'
result = re.findall(pattern, string)
print(result) # ['1992', '2020']
这就是在Python中如何使用正则表达式的一些基本的例子。
这里有一些很好的文章,可以更深入地了解Python中的正则表达式
这就是今天全部的内容。明天我将进军Python中的测试技术。我感到很期待。