关于python:Python正则表达式完全指南

6次阅读

共计 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 产品业务负责人。

正文完
 0