博客
关于我
[python复习6]正则表达式
阅读量:608 次
发布时间:2019-03-13

本文共 2925 字,大约阅读时间需要 9 分钟。

正则表达式基础入门

正则表达式(Regular Expression, 简称regex)是一种强大的工具,能够帮助我们对字符串进行模式匹配操作。它广泛应用于文本处理、数据批量处理、网络爬虫等领域,极大提升了数据处理效率。本文将从基础概念出发,逐步解析正则表达式的核心知识。

基本字符匹配

正则表达式的核心在于定义匹配的字符。常见的字符匹配方式包括:

  • # 匹配单个字符
  • . 匹配任意单个字符(注意:\n除外)
  • [] 匹配特定字符集合
  • \d 匹配数字(0-9)
  • \D 匹配非数字
  • \s 匹配空白字符(包括空格和制表符)
  • \S 匹配非空白字符
  • \w 匹配单词字符(字母、数字和下划线)
  • \W 匹配非单词字符
  • 支持中文:在某些正则库支持中文字符,默认情况下\w包含中文汉字

以下是通过正则表达式匹配的示例:

rec = re.match(r'速度与激情[1-23-4a-bg-y]', '速度与激情h')

以上代码的意思是:匹配"速度与激情"后跟任意一个由[1-23-4a-bg-y]中字符组成的单字符组合。例如,如果输入为"速度与激情哈",则h不在匹配集合中,因此无法匹配;而"速度与激情12"则能成功匹配,因为\d匹配数字。

多字符匹配

正则表达式也支持匹配多个字符,这通过使用 * + ? {m} {m,n} 等量词来实现。具体含义如下:

1. * :前一个字符出现0次或更多次(可有可无)

2. +:前一个字符出现至少一次或更多次

3. ?:前一个字符出现0次或一次

4. {m}:前一个字符恰好出现m

5. {m,n}:前一个字符的出现次数范围在mn之间(包含两者)

例如,用正则表达式'速度与激情\d{1,2}'匹配"速度与激情12"和"速度与激情1"都能成功,因为\d{1,2}表示匹配1位或2位的数字。而"速度与激情123"则不匹配,因为3位数字超出了{1,2}的范围。

下列代码展示了如何匹配带有格式化符号的电话号码:

rec = re.match('021-?\d{8}', '021-123156465')

这里的021-?表示以"021-"开头,后面跟一个可选的"-",再匹配8位数字。因此,输入"021-123156465"能成功匹配,因为在-后映射了8位数字。但"023456789"则不匹配,因为没有-符号。

此外,当要匹配包含换行或特殊字符的任意文本时,需要在正则表达式中添加re.S标志,允许.匹配所有字符,包括换行符。例如:

rec = re.match('.*', html, re.S)

这样,.将匹配包括换行在内的任意单字符,允许.*匹配整个文本文件内容。

分组与引用

正则表达式的分组功能允许我们将模式中的部分内容单独提取,并在其他部分引用这些内容。分组的方式有以下几种:

  • 简单分组:(ab)表示将ab作为一组匹配内容。
  • 引用分组:可以使用\1\2等表示引用前面分组的内容。
  • 起别名分组:(?P$name)为分组取一个别名,后续可以通过\name引用。

例如,在处理HTML标签时,常常需要提取标签内的内容并进行替换。以下代码实现了将HTMLışık中的内 Bren进行提取和替换:

rec = re.match(r'<(\w*)>.*
', h)

这里的(\w*)表示匹配<后面的任意单词字符>,并将其作为第一组分组记录。然后.*匹配任意文本,最后<!--\1-->部分将使用第一组的内容进行替换。这意味着,在h中如果存在<cat>,则会匹配整个<cat>并提取cat到第一组,然后替换为 cat,从而得到cat被加粗显示的结果。

常用正则表达式的方法

除了匹配文本,正则表达式还可以与字符串进行替换、分割、搜索等操作。以下是常用的函数:

  • match():仅匹配字符串开头部分,返回匹配结果或None
  • search():在整个字符串中搜索匹配,并返回第一个匹配的结果。
  • findall():找到所有与模式匹配的子串,返回为一个列表。
  • sub():将匹配的子串替换为指定字符串。
  • split():根据正则表达式切割字符串,返回子串列表。

例如,提交一个包含字母、数字和下划线的邮箱地址,使用正则表达式验证格式是否正确。以下代码展示了一个简短的验证逻辑:

def main(): email = input("请输入邮箱地址:") rec = re.match(r'[a-zA-Z0-9_]{4,18}@(163|126|qq)\.com$', email) if rec: print("成功:%s" % email) else: print("失败:%s" % email)if __name__ == '__main__': main()

贪婪与非贪婪模式

在正则表达式中,贪婪模式和非贪婪模式的概念至关重要。这两个模式决定了匹配引擎在遇到多种可能匹配时如何选择路径。

  • 贪婪模式(默认):在遇到多个可能匹配选项时,优先匹配最长的或者字符尽可能多的选项。例如,a+会匹配从字符串开头开始尽可能多地匹配a
  • 非贪婪模式(使用?修饰):在遇到多个可能匹配选项时,优先匹配最少的字符。例如,a?会匹配a的最短量。

理解贪婪与非贪婪模式的意义,对于编写高效且准确的正则表达式至关重要。例如,在处理文件格式识别时,通常需要使用非贪婪模式来确保正确识别文件的结尾部分,而不是被前面的内容覆盖。

实际案例分析

以下是一个电子邮件验证的实际应用案例。以用户输入的邮箱地址为例,正则表达式验证其是否符合常见邮箱格式(如QQ邮箱、126邮箱等)。以下是具体的实现逻辑:

rec = re.match(r'[a-zA-Z0-9_]{4,18}@(163|126|qq)\.com$', i)

这个正则表达式的含义是:

-
[a-zA-Z0-9_]{4,18}:表示用户名部分,4到18位,包含字母、数字和下划线。-
@:匹配@符号。-
(163|126|qq):表示域名部分,可选择163、126或qq。-
\.com$:匹配
.com域名结尾。

然后,根据匹配结果判断邮箱是否有效。如果recNone,则输入的邮箱地址不符合格式,返回“失败”;否则,返回“成功”。

常见写法错误与注意事项

在编写正则表达式时,很多人容易出现以下错误:

- 忽略了特殊字符的转义要求(如
*在正则中表示任意字符,需在
\前加上转义字符)。- 没有正确使用分组和引用功能,导致模式无法正确应用。- 没有正确理解贪婪与非贪婪模式的含义,导致匹配结果错误。

为了避免这些问题,在编写正则表达式时,应:

- 严格按照转义规则来处理特殊字符。- 使用调试工具对模式和测试字符串进行验证。- 熟悉分组和背 Vand tighten引用功能的使用。- 注重理解正则表达式的工作原理,避免盲目复制模式。

总结

正则表达式是一种强大而灵活的工具,能够帮助我们在文本处理中高效处理复杂模式的匹配和替换任务。掌握正则表达式的基础知识,是每个开发人员不可或缺的能力。通过不断练习和实践,您将能够编写出更复杂和精准的正则表达式,从而显著提升工作效率。

转载地址:http://aypaz.baihongyu.com/

你可能感兴趣的文章
Android 发布应用市场资料
查看>>
什么是苹果签名?如何选择靠谱的苹果签名苹果代签服务商呢 ?
查看>>
Go语言编程第四章并发编程
查看>>
ActivityNotFoundException异常错误
查看>>
文件存储ExtenalStorage和InternalStorage使用以及区别
查看>>
socket 乱码解决
查看>>
Dubbo入门示例
查看>>
elasticsearch 不能root启动
查看>>
Error merging: refusing to merge unrelated histories
查看>>
git远程仓库切换
查看>>
国芯网国产芯片精选月刊V20190801 国产芯片 芯片选型 芯片厂家
查看>>
华大芯片调试问题
查看>>
DCMTK:存储服务类用户(C-STORE操作)
查看>>
ISTA算法-图像压缩感知算法之ISTA算法
查看>>
ESP32 SIM800L:发送带有传感器读数的文本消息(SMS警报)
查看>>
带照片捕捉功能的ESP32-CAM PIR运动检测器
查看>>
ARM Mbed RFID读取器
查看>>
聚焦Python和OpenCV的图像处理,3D场景重建,对象检测和跟踪 - 使用深度传感器的手势识别
查看>>
如何使用SSH远程管理Linux服务器
查看>>
降级到旧版本macOS的3种方法
查看>>