摘要:Python正则表达式标准库介绍

我将从正则表达式开始讲Python的标准库。正则表达式是文字处理中常用的工具,而且不需要额外的系统知识或经验。我们会把系统相关的包放在后面讲解。

正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容。

语法

之前,我们简介了字符串相关的处理函数。我们可以通过这些函数实现简单的搜索功能,比如说从字符串“I love you”中搜索是否有“you”这一子字符串。但有些时候,我们只是模糊地知道我们想要找什么,而不能具体说出我是在找“you”,比如说,我想找出字符串中包含的数字,这些数字可以是0到9中的任何一个。这些模糊的目标可以作为信息写入正则表达式,传递给Python,从而让Python知道我们想要找的是什么。

(官方documentation)

在Python中使用正则表达式需要标准库中的一个包re。

1
2
3

import re
m = re.search('[0-9]','abcd4ef')
print(m.group(0))

re.search()接收两个参数,第一个’[0-9]‘就是我们所说的正则表达式,它告诉Python的是,“听着,我从字符串想要找的是从0到9的一个数字字符”。

re.search()如果从第二个参数找到符合要求的子字符串,就返回一个对象m,你可以通过m.group()的方法查看搜索到的结果。如果没有找到符合要求的字符,re.search()会返回None。

如果你熟悉Linux或者Perl, 你应该已经熟悉正则表达式。当我们打开Linux shell的时候,可以用正则表达式去查找或着删除我们想要的文件,比如说:

$rm book[0-9][0-9].txt

这就是要删除类似于book02.txt的文件。book[0-9][0-9].txt所包含的信息是,以book开头,后面跟两个数字字符,之后跟有”.txt”的文件名。如果不符合条件的文件名,比如说:

bo12.txt

book1.txt

book99.text

都不会被选中。

Perl中内建有正则表达式的功能,据说是所有正则表达式系统中最强的,这也是Perl成为系统管理员利器的一个原因。

正则表达式的函数

1
2

m = re.search(pattern, string)  # 搜索整个字符串,直到发现符合的子字符串。
m = re.match(pattern, string)   # 从头开始检查字符串是否符合正则表达式。必须从字符串的第一个字符开始就相符。

可以从这两个函数中选择一个进行搜索。上面的例子中,我们如果使用re.match()的话,则会得到None,因为字符串的起始为‘a’, 不符合’[0-9]‘的要求。

对于返回的m, 我们使用m.group()来调用结果。(我们会在后面更详细解释m.group())

我们还可以在搜索之后将搜索到的子字符串进行替换:

1
2

str = re.sub(pattern, replacement, string)
# 在string中利用正则变换pattern进行搜索,对于搜索到的字符串,用另一字符串replacement替换。返回替换后的字符串。

此外,常用的正则表达式函数还有

re.split()    # 根据正则表达式分割字符串, 将分割后的所有子字符串放在一个表(list)中返回

re.findall()  # 根据正则表达式搜索字符串,将所有符合的子字符串放在一给表(list)中返回

(在熟悉了上面的函数后,可以看一下re.compile(),以便于提高搜索效率。)

写一个正则表达式

关键在于将信息写成一个正则表达式。我们先看正则表达式的常用语法:

1)单个字符:

.          任意的一个字符

a|b        字符a或字符b

[afg]      a或者f或者g的一个字符

[0-4]      0-4范围内的一个字符

[a-f]      a-f范围内的一个字符

[^m]       不是m的一个字符

s         一个空格

S         一个非空格

d         [0-9]

D         [^0-9]

w         [0-9a-zA-Z]

W         [^0-9a-zA-Z]

2)重复

紧跟在单个字符之后,表示多个这样类似的字符

*         重复 >=0 次

+         重复 >=1 次

?         重复 0或者1 次

{m}       重复m次。比如说 a{4}相当于aaaa,再比如说[1-3]{2}相当于[1-3][1-3]

{m, n}    重复m到n次。比如说a{2, 5}表示a重复2到5次。小于m次的重复,或者大于n次的重复都不符合条件。

正则表达          相符的字符串举例

[0-9]{3,5}       9678

a?b              b

a+b              aaaaab

3) 位置

^         字符串的起始位置

$         字符串的结尾位置

正则表达          相符的字符串举例        不相符字符串

^ab.*c$          abeec               cabeec (如果用re.search(), 将无法找到。)
4)返回控制

我们有可能对搜索的结果进行进一步精简信息。比如下面一个正则表达式:

output_(d{4})

该正则表达式用括号()包围了一个小的正则表达式,d{4}。 这个小的正则表达式被用于从结果中筛选想要的信息(在这里是四位数字)。这样被括号圈起来的正则表达式的一部分,称为群(group)。
我们可以m.group(number)的方法来查询群。group(0)是整个正则表达的搜索结果,group(1)是第一个群……

1
2
3

import re
m = re.search("output_(d{4})", "output_1986.txt")
print(m.group(1))

我们还可以将群命名,以便更好地使用m.group查询:

1
2
3

import re
m = re.search("output_(?P<year>d{4})", "output_1986.txt")   #(?P<name>...) 为group命名
print(m.group("year"))

总结

re.search() re.match() re.sub() re.findall()

正则表达式构成方法

练习
有一个文件,文件名为output_1981.10.21.txt 。下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几。将文件改名为output_YYYY-MM-DD-W.txt (YYYY:四位的年,MM:两位的月份,DD:两位的日,W:一位的周几,并假设周一为一周第一天)

习题参考解答

1
2
3
4
5
6
7
8
9
10
11

import re
import datetime
m = re.search('output_(?P<year>d{4}).(?P<month>d{2}).(?P<day>d{2})', 'output_1981.10.21.txt')
weekday = datetime.datetime(int(m.group('year')),int(m.group('month')),int(m.group('day'))).strftime("%w")
filename = 'output_' + m.group('year') + '-' + m.group('month') + '-' + m.group('day') + '-' + weekday + '.txt'
print (weekday)
print filename

Python标准库01 正则表达式 (re包)相关推荐

  1. Python标准库01 正则表达式(re包)

    python正则表达式基础 简单介绍 正则表达式并不是python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...

  2. Python标准库07 信号 (signal包,部分os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  3. 6.Python标准库_子进程 (subprocess包)

    Vamei博客地址:http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html 这里的内容以Linux进程基础和Linux文本流为基础.s ...

  4. Python标准库之正则表达式(re库)

    目录 正则表达式 正则表达式语法 [] + * ? $ ^ {n} {m,n} \d \D \s \S \w \W \b \B . | () 模块内容 re.match(pattern[过滤模式],s ...

  5. python信号处理库_Python标准库07 信号 (signal包,部分os包)(转载)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  6. python标准库有多强大_Python标准库——走马观花

    原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的一大好处在于它有一套很有用的标 ...

  7. Python标准库简介

    很系统的简介了Python标准库的使用方向,对形成知识框架很有帮助. 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python ...

  8. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  9. Python标准库03 路径与文件 (os.path包, glob包)

    摘要:Python标准库 文件系统 os.path glob.glob os.path包 os.path包主要是处理路径字符串,比如说'/home/vamei/doc/file.txt',提取出有用信 ...

最新文章

  1. php mongodb execute,php简单操作mongodb
  2. ZOJ3772_Calculate the Function
  3. 你必须知道的Docker数据卷
  4. 简评黑客利器——中国菜刀
  5. 每日一练丨性能优化-实例优化(三)
  6. matlab循环取出矩阵的某一行并标示上A1 A2 A3
  7. cogs 1111. 最短路
  8. c iostream.源码_通达信三线注意买入主图指标公式【源码分享】
  9. VS C# 中使用番茄助手
  10. Xilinx平台SRIO介绍(五)示例工程Example Design介绍
  11. java 中级面试题_java中级面试题
  12. 阿沐帮大家总结了自动化基本操作——selenium_常见技巧
  13. 2020寒假牛客第一场——G eli和字符串
  14. 炼数成金 Oracle EBS R12 DBA培训视频教程
  15. iOS 21种设计模式之工厂模式
  16. 20行Python代码爬取网站美女图,哇太多了,我U盘装满了
  17. 统计字符出现的次数(输出由多到少)
  18. 计算机开机硬件检查,开机bios检测硬件信息方法
  19. 一文讲透鱼眼相机畸变矫正,及目标检测项目应用
  20. 通过JAVA读取Visio

热门文章

  1. Android 5.1 修改系统默认语言
  2. Eclipse新建工程编译R cannot be resolved to a variable问题
  3. linux内核中的GPIO系统之(1):软件框架
  4. CS通用项目系统搭建——三层架构第一天
  5. 第58件事 借势文案创作实例
  6. NJ4X源码阅读分析笔记系列(一)——项目整体分析
  7. [LeetCode]--160. Intersection of Two Linked Lists
  8. 三步骤定位Windows崩溃进程
  9. JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)
  10. ModifyStyle函数的用法