本篇文章将深入探讨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))  # 输入:123print(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'))  # 输入:Jamesprint(match.group('phone'))  # 输入:1234567890

在这个例子中,咱们应用了命名组(?P<name>\w+)(?P<phone>\d+)来匹配名字和电话号码,并应用group()办法来获取它们。

正则表达式是一个十分弱小的工具,心愿本篇文章能帮你把握它在Python中的用法。

如有帮忙,请多关注
集体微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业教训,10年+技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。