了解如何使用 Python 的内置 re 模块使用 match、search、finditer 和 sub 等函数来使用多种字符串匹配技术。
如何在Python中使用正则表达式?一个正则表达式是形成一个搜索模式字符的特殊序列,它可以被用来检查一个字符串包含指定的模式,也可以用于提取所有匹配模式等等。
正则表达式无处不在,从验证电子邮件地址、密码、日期格式到在搜索引擎中的使用,因此它是任何开发人员的必备技能,并且大多数编程语言都提供了正则表达式功能。
Python如何使用正则表达式?如果你熟悉 Linux,我想你已经看到了一些使用 sed 和 grep 命令的正则表达式,但在本教程中,我们将 在 Python 中重新模块。以下是我们将介绍的技术:
- 匹配字符串
- 搜索方法
- 查找多个匹配项
- 替换匹配
Python正则表达式用法示例:匹配字符串有关如何使用
re.match()
函数的演示,假设你要验证用户密码。例如,你要确保他们输入的密码长度至少为 8 个字符,并且至少包含一位数字。以下代码执行此操作:import re # stands for regular expression
# a regular expression for validating a password
match_regex = r"^(?=.*[
0-9]).{8,}$"
# a list of example passwords
passwords = [
"pwd", "password", "password1"]
for pwd in passwords:
m = re.match(match_regex, pwd)
print(f"Password: {pwd}, validate password strength: {bool(m)}")
如何在Python中使用正则表达式?
match_regex
是负责验证我们前面提到的密码标准的正则表达式:^
: 开始字符。(?=.*[0-9])
:确保字符串至少有一个数字。.{8,}
:确保字符串至少有 8 个字符。$
: 结束字符。
Password: pwd, validate password strength: False
Password: password, validate password strength: False
Password: password1, validate password strength: True
不出所料,前两次失败,最后一次成功。第一个密码 (
pwd
) 少于 8 个字符,第二个不包含数字,而第三个至少有 8 个字符并包含一个数字。请注意,我们
re.match()
使用内置方法包装了该bool()
方法以返回一个布尔值,指示字符串是否与模式匹配。搜索方法Python如何使用正则表达式?演示该
re.search()
方法的一个很好的例子是在字符串中搜索特定模式。在本节中,我们将尝试从Windows 中的ipconfig命令输出的一部分中提取 IPv4 地址:import re# part of ipconfig output
example_text = """
Wireless LAN adapter Wi-Fi:
Connection-specific DNS Suffix. :
Link-local IPv6 Address . . . . . : fe80::380e:9710:5172:caee%2
IPv4 Address. . . . . . . . . . . : 192.168.1.100
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
"""
# regex for IPv4 address
ip_address_regex = r"((25[
0-5]|(2[
0-4]|1[
0-9]|[
1-9]|)[
0-9])(\.(?!$)|$)){4}"
# use re.search() method to get the match object
match = re.search(ip_address_regex, example_text)
print(match)
不要太担心
ip_address_regex
表达式,它基本上验证一个 IPv4 地址(确保总数4中的每个数字不超过255)。re.search()
在这种情况下,我们使用搜索有效的 IPv4 地址,这是输出:<
_sre.SRE_Match object;
span=(281, 292), match='192.168.1.1'>
re.search()
返回一个匹配对象,该对象具有找到的字符串和实际字符串的开始和结束索引,在这种情况下,它'192.168.1.1'
作为匹配的字符串返回。你可以使用:match.start()
获取找到的模式的第一个字符的索引。match.end()
获取找到的模式的最后一个字符的索引。match.span()
以元组 (start
,end
) 的形式获取开始和结束。match.group()
获取找到的实际字符串。
Python正则表达式用法示例:查找多个匹配项我们将使用相同命令 ( ipconfig )的输出,但这次我们将尝试使用正则表达式来匹配 MAC 地址:
import re# fake ipconfig output
example_text = """
Ethernet adapter Ethernet:
Media State . . . . . . . . . . . : Media disconnected
Physical Address. . . . . . . . . : 88-90-E6-28-35-FA
Ethernet adapter Ethernet 2:
Physical Address. . . . . . . . . : 04-00-4C-4F-4F-60
Autoconfiguration IPv4 Address. . : 169.254.204.56(Preferred)
Wireless LAN adapter Local Area Connection* 2:
Media State . . . . . . . . . . . : Media disconnected
Physical Address. . . . . . . . . : B8-21-5E-D3-66-98
Wireless LAN adapter Wi-Fi:
Physical Address. . . . . . . . . : A0-00-79-AA-62-74
IPv4 Address. . . . . . . . . . . : 192.168.1.101(Preferred)
Default Gateway . . . . . . . . . : 192.168.1.1
"""
# regex for MAC address
mac_address_regex = r"([
0-9A-Fa-f]{2}[
:-]){5}([
0-9A-Fa-f]{2})"
# iterate over matches and extract MAC addresses
extracted_mac_addresses = [
m.group(0) for m in re.finditer(mac_address_regex, example_text) ]
print(extracted_mac_addresses)
定义正则表达式后,我们使用
re.finditer()
函数查找传递的字符串中所有出现的 MAC 地址。由于
finditer()
返回匹配对象的迭代器,我们使用列表推导来仅提取使用group(0)
(整个匹配项)找到的 MAC 地址。查看输出:[
'88-90-E6-28-35-FA', '04-00-4C-4F-4F-60', 'B8-21-5E-D3-66-98', 'A0-00-79-AA-62-74']
太棒了,我们已经成功提取了该字符串中的所有 MAC 地址。在下一节中,我们将看到如何使用正则表达式替换字符串中出现的模式。
替换匹配Python正则表达式用法示例:如果你有网络抓取经验,你可能会遇到使用CloudFlare 等服务从电子邮件收集工具隐藏电子邮件地址的网站。在本节中,我们将完全这样做,给定一个包含电子邮件地址的字符串,我们将用
'[email protected]'
令牌替换每个地址:import re# a basic regular expression for email matching
email_regex = r"[
a-zA-Z0-9_.+-]+@[
a-zA-Z0-9-]+\.[
a-zA-Z0-9-.]+"
# example text to test with
example_text = """
Subject: This is a text email!
From: John Doe <
john@doe.com>
Some text here!
===============================
Subject: This is another email!
From: Abdou Rockikz <
example@domain.com>
Some other text!
"""
# substitute any email found with [
email protected]
print(re.sub(email_regex, "[
email protected]", example_text))
Python如何使用正则表达式?我们使用了
re.sub()
带 3 个参数的方法,第一个是正则表达式(模式),第二个是替换找到的所有模式,第三个是目标字符串,这里是输出:Subject: This is a text email!
From: John Doe <
[
email protected]>
Some text here!
===============================
Subject: This is another email!
From: Abdou Rockikz <
[
email protected]>
Some other text!
太好了,正如我们预期的那样,该
re.sub()
函数返回通过用指定的替换(第二个参数)替换 string 中模式最左边的非重叠出现而获得的字符串。结论如何在Python中使用正则表达式?现在你已经掌握了在 Python 中使用正则表达式的技能,注意我们没有涵盖re模块提供的所有方法,还有其他方便的函数,比如
split()
and fullmatch()
,所以我强烈建议你查看Python 的官方文档。【如何在Python中使用正则表达式(代码示例教程)】如果你不确定如何根据需要构建和构造正则表达式,你可以查看官方文档或本教程。
推荐阅读
- 如何在Python中处理JSON文件(详细示例介绍)
- Python如何使用日志功能(代码示例教程)
- 如何用Python制作聊天应用程序(实现代码示例)
- 如何在Python中删除电子邮件(代码实现示例)
- Python中的守护线程是什么(如何理解和使用?)
- 如何在Python中生成和读取二维码(实现代码示例)
- 戴尔Latitude 5290二合一电脑评测体验详情
- 导致笔记本电脑发烧发热的原因有哪些?
- 8+300才是真饭!新酷睿攒机看这里