首页 > 编程语言 >Python正则表达式完全指南

Python正则表达式完全指南

时间:2023-06-13 11:34:47浏览次数:35  
标签:指南 匹配 re Python 正则表达式 txt Hello match

本篇文章将深入探讨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产品业务负责人。

标签:指南,匹配,re,Python,正则表达式,txt,Hello,match
From: https://www.cnblogs.com/xfuture/p/17477067.html

相关文章

  • Python实现同时支持带调用和不调用带装饰器
    一般来说,不带参数装饰器,再使用时不加括号,带参数的装饰器使用时必须加括号。例如不带参装饰器definfo(func):#装饰器,参数接收一个函数,返回一个函数@functools.wraps(func)defwrapper(*args,**kwargs):#与原函数功能一致,支持任意参数print(f'调用......
  • appium2+Python3+红米手机k40 无法启动APP
    在网上一直找不到解决的方法,困扰了很久。OEM解锁权限和USB调试安全设置也打开试过了,还是不行。有懂的大佬吗!Python报错提示:Message:Anunknownserver-sideerroroccurredwhileprocessingthecommand.Originalerror:ErrorexecutingadbExec.Originalerror:'Command......
  • pip安装python包
    1.国内源:1)http://mirrors.aliyun.com/pypi/simple/阿里云2)https://pypi.mirrors.ustc.edu.cn/simple/中国科技大学 3)https://pypi.tuna.tsinghua.edu.cn/simple 清华大学2.指定源pip3install-ihttp://mirrors.aliyun.com/pypi/simple/--trusted-hostmirrors.aliyun......
  • Jmeter-正则表达式提取器
    问题:提取token里面的值,给后面的请求使用一、1、使用正则表达式提取器,将响应数据中的token值提取出来 2、后面请求使用该变量 二、正则表达式书写响应数据:{"access_token":"278462b1-5116-46fb-be43-fe9230dc4d90","token_type":"bearer","refresh_token":"13793a3f-32bd-......
  • 如何安装安装Python解释器
    安装Python解释器的步骤如下:打开Python官网:https://www.python.org/downloads/,下载最新的Python版本(例如Python3.11.4)。双击下载的安装程序,按照提示一步步进行安装;在安装过程中,要注意勾选“AddPython3.xtoPATH”选项,这样就可以在命令行中直接使用Python命令了。Win+......
  • python 中格式化字符串
     001、format>>>"{0}love{1}.{2}".format("I","FishC","com")##位置参数'IloveFishC.com'>>>"{a}love{b}.{c}".format(a="I",b="FishC"......
  • Python 面向对象之类和对象
    什么叫做面向对象:就是把编程当作一个事物,直接去用,不考虑中间的过程,可与面向过程做比较理解;打个比方:例如:肚子饿了,想吃饭面向过程:去超市---买菜---卖肉---买米---回家---洗菜---切肉---炒菜---煮米饭---盛饭---开吃面向对象:点外卖类和对象:类是抽象的,对象是真实存在的类与对......
  • python 中使用zip实现矩阵转置
     001、[root@PC1test04]#lsa.txttest.py[root@PC1test04]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930[root@PC1test04]#cattest.py##测试程序#!/usr/bin/envpython#-*......
  • python: read excel
    pipinstallxlrdpipinstallxlwtpipinstallxlutilspipinstallxlwingspipinstallXlsxWriterpipinstallopenpyxlpipinstallpandaspipinstallpandasql importDrawSquareimportDecoratorsimportxlrdimportxlwtimportxlwingsasxwimportxlsxwriterim......
  • python中zip的用法
     001、>>>a=[1,2,3]>>>b=[4,5,6]>>>c=[7,8,9,10,11]##测试列表>>>list(zip(a,b))[(1,4),(2,5),(3,6)]>>>list(zip(a,c))##返回列表元祖[(1,7),(2,8),(3,9)]  002、>>......