共计 2494 个字符,预计需要花费 7 分钟才能阅读完成。
本篇文章将深入探讨 python 的一项弱小工具:正则表达式。正则表达式是一个弱小的文本处理工具,能够用来匹配,搜寻,替换和解析文本。咱们将逐渐展现如何在 Python 中应用正则表达式,包含其根本语法,常见用法和一些高级技巧。而在最初的“one more thing”局部,咱们将摸索一个鲜为人知但又十分有用的正则表达式的技巧。
简略正则表达式匹配
在 Python 中,re
模块提供了正则表达式的反对。咱们先从最简略的字符匹配开始。
import re
# 查看字符串是否蕴含字母 "a"
txt = "Hello, world!"
match = re.search("a", txt)
print(match) # 输入:None,因为 "a" 没有在字符串中
在这个例子中,咱们应用了 re.search()
函数来查找字符串中是否蕴含 ”a”。这是最根底的字符匹配,但曾经能够看出正则表达式的用途。例如,你能够用这种形式查看一个电子邮件地址是否蕴含 ”@”。
应用元字符
正则表达式的真正威力在于其元字符的应用,比方 .
,*
,?
,[]
等等。上面的例子展现了如何应用.
(点)元字符匹配任何字符(除了新行)。
txt = "Hello, world!"
match = re.search("H.llo", txt)
print(match.group()) # 输入:Hello
在这个例子中,.
字符匹配了 ”e”,使得 ”H.llo” 能够匹配 ”Hello”。
应用预约义的字符集
有时咱们心愿匹配的是一类字符,而不是单个字符。比方,咱们可能想要匹配任何数字。Python 的正则表达式提供了预约义的字符集来实现这种性能。\d
就代表任何数字。
txt = "123 Hello, world!"
match = re.search("\d+", txt)
print(match.group()) # 输入:123
在这个例子中,\d+
匹配了一串数字 ”123″。
分组和捕捉
咱们能够应用圆括号 ()
创立子模式或组,并应用 group()
办法来捕捉这些组。
txt = "123 Hello, world!"
match = re.search("(\d+) (Hello),", txt)
print(match.group(1)) # 输入:123
print(match.group(2)) # 输入:Hello
应用正向后行断言
这是一个高级技巧,它容许咱们在不耗费字符的状况下进行匹配。例如,咱们可能想找出所有以句号完结但不蕴含句号的句子。
txt = "Hello. My name is Python. Nice to meet you."
matches = re.findall(".*?(?=\\.)", txt)
for match in matches:
print(match) # 输入:Hello,My name is Python,Nice to meet you
在这个例子中,.*?(?=\\.)
匹配了所有以句号完结的句子,但并没有耗费句号。
字符集和范畴
咱们之前探讨过预约义的字符集,比方 \d
。但有时咱们可能须要自定义字符集,咱们能够应用方括号[]
来达成这个指标。例如,咱们能够创立一个只蕴含小写字母的字符集。
txt = "Hello, World!"
match = re.search("[a-z]+", txt)
print(match.group()) # 输入:ello
在这个例子中,[a-z]+
匹配了一串间断的小写字母 ”ello”。留神 ”Hello” 的首字母 ”H” 因为是大写,没有被匹配。
贪心匹配和非贪心匹配
Python 的正则表达式默认是贪心的,这意味着它们会尽可能匹配更多的字符。但有时咱们可能心愿进行非贪心匹配。咱们能够通过在量词前面增加问号 ?
来实现这个性能。
txt = "12345"
match = re.search("\d+?", txt)
print(match.group()) # 输入:1
在这个例子中,\d+?
进行了非贪心匹配,只匹配了一个数字 ”1″。
零宽断言
零宽断言容许咱们在字符之间设置条件。比方,咱们能够应用 (?<=a)b
来匹配所有在 ”a” 前面的 ”b”。
txt = "cab, dab"
matches = re.findall("(?<=a)b", txt)
for match in matches:
print(match) # 输入:b,b
在这个例子中,(?<=a)b
匹配了所有在 ”a” 前面的 ”b”。
应用编译的正则表达式
如果你的程序须要屡次应用同一个正则表达式,你能够将其编译为一个正则表达式对象。这能够进步代码的运行效率。
pattern = re.compile("\d+")
txt = "123 Hello, world!"
match = pattern.search(txt)
print(match.group()) # 输入:123
在这个例子中,咱们先编译了正则表达式 \d+
,而后应用pattern.search()
办法来进行匹配。
One More Thing
到当初为止,咱们曾经探讨了 Python 正则表达式的基础知识。然而在这最初的 ”One More Thing” 局部,我想分享一个不常被提及,但在解决简单文本模式时十分有用的技巧:命名组。
命名组容许咱们给匹配的组调配一个名字,而后在前面的代码中援用它。这在解决简单的模式匹配时十分有用。
txt = "James: 1234567890"
match = re.search("(?P<name>\w+): (?P<phone>\d+)", txt)
print(match.group('name')) # 输入:James
print(match.group('phone')) # 输入:1234567890
在这个例子中,咱们应用了命名组 (?P<name>\w+)
和(?P<phone>\d+)
来匹配名字和电话号码,并应用 group()
办法来获取它们。
正则表达式是一个十分弱小的工具,心愿本篇文章能帮你把握它在 Python 中的用法。
如有帮忙,请多关注
集体微信公众号:【Python 全视角】
TeahLead_KrisChang,10+ 年的互联网和人工智能从业教训,10 年 + 技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收 AI 产品业务负责人。