正则表达式 为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串。换句话说,它们能够匹配多个字符串……一种只能匹配一个字符串的正则表达式模式是很乏味并且毫无作用的,不是吗?Python 通过标准库中的 re 模块来支持正则表达式

正则表达式的特殊字符列表

特殊字符 描述
. 匹配所有字符串,除\n以外
- 表示范围[0-9]
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +
^ 匹配字符串开头
$ 匹配字符串结尾
\ 转义字符, 使后一个字符改变原来的意思,如果字符串中有字符*需要匹配,可以*
? 匹配前一个字符串0次或1次
{m} 匹配前一个字符m次
{n,m} 匹配前一个字符n到m次
\d 匹配数字,等于[0-9]
\D 匹配非数字,等于[^0-9]
\w 配字母和数字,等于[A-Za-z0-9]
\W 匹配非英文字母和数字,等于[^A-Za-z0-9]
\s 匹配空白字符
\S 匹配非空白字符
\A 匹配字符串开头
\Z 匹配字符串结尾
\b 匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的
\B 与\b相反,只在当前位置不在单词边界时匹配
(?P...) 分组,除了原有编号外在指定一个额外的别名
[] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号

Python的re正则表达式模块提供的方法

  1. re.match(pattern, string, flags=0) #从字符串的起始位置匹配,如果起始位置匹配不成功的话,match()就返回none
  2. re.search(pattern, string, flags=0) #扫描整个字符串并返回第一个成功的匹配
  3. re.findall(pattern, string, flags=0) #找到RE匹配的所有字符串,并把他们作为一个列表返回
  4. re.finditer(pattern, string, flags=0) #找到RE匹配的所有字符串,并把他们作为一个迭代器返回
  5. re.sub(pattern, repl, string, count=0, flags=0) #替换匹配到的字符串

函数参数说明:

pattern: 匹配的正则表达式 string:要匹配的字符串

flags: 标记为,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

repl: 替换的字符串,也可作为一个函数

count: 模式匹配后替换的最大次数,默认0表示替换所有匹配

  1. import re
  2. m = re.match(r'f..', r'begin fool hello') # match 从字符串的开始位置进行搜索,如果需从字符串任意位置进行搜索,需使用下文中的search方法
  3. if m is not None:
  4. print('found : ' + m.group())
  5. else:
  6. print('not found!')
  1. not found!
search()函数不但会搜索模式在字符串中第一次出现的位置,而且严格地对字符串从左到右搜索。
  1. m = re.search(r'foo', 'beginfool hello')
  2. if m is not None:
  3. print('found : ' + m.group())
  4. else:
  5. print('not found...')
  1. found : foo
匹配任何单个字符串
  1. anyend = '.end'
  2. m = re.match(anyend, 'bend') # 点号匹配‘b’
  3. if m is not None: print(m.group())
  1. bend
  1. m = re.match(anyend, 'end') # 不匹配任何字符串
  2. if m is not None: print(m.group())
  3. m = re.match(anyend, '\nbend') # 除了'\n'之外的任何字符串
  4. if m is not None: print(m.group())
  5. m = re.match(anyend, 'The end.') # 点号匹配‘ end’
  6. if m is not None: print(m.group())
gorup()和groups()方法的使用
  1. m = re.match(r'(\w{3})-(\d{3})', 'abc-123')
  2. if m is not None:
  3. print('m.group(): ' + m.group())
  4. print('m.group(1): ' + m.group(1))
  5. print('m.group(2): ' + m.group(2))
  6. print('m.groups(): ' + str(m.groups()))
  1. m.group(): abc-123
  2. m.group(1): abc
  3. m.group(2): 123
  4. m.groups(): ('abc', '123')

findall()查询字符串中某个正则表达式模式全部的非重复出现情况。这与 search()在执行字符串搜索时类似,但与 match()和 search()的不同之处在于,findall()总是返回一个列表。如果 findall()没有找到匹配的部分,就返回一个空列表,但如果匹配成功,列表将包含所有成功的匹配部分(从左向右按出现顺序排列)。

  1. re.findall('car', 'car')
  2. re.findall('car', 'scary')
  3. re.findall('car', 'carry the brcardi to the car')
  1. ['car']
  2. ['car']
  3. ['car', 'car', 'car']
finditer()和findall()返回的匹配字符串相比,finditer()在匹配对象中迭代.
  1. s = 'This and that.'
  2. re.findall(r'(th\w+)', s, re.I)
  3. iter = re.finditer(r'(th\w+)', s, re.I)
  4. [g.group() for g in iter] # findall 返回一个列表,而finditer返回一个迭代器
  5. iter
  1. ['This', 'that']
  2. <callable_iterator at 0x594a780>
  3. []

有两个函数/方法用于实现搜索和替换功能:sub()和 subn()。两者几乎一样,都是将某字符串中所有匹配正则表达式的部分进行某种形式的替换。用来替换的部分通常是一个字符串,但它也可能是一个函数,该函数返回一个用来替换的字符串。subn()和 sub()一样,但 subn()还返回一个表示替换的总数,替换后的字符串和表示替换总数的数字一起作为一个拥有两个元素的元组返回。

  1. print(re.sub('X', 'Mr. Iceman', 'attn: X\n\nDear X,\n'))
  2. print(re.subn('X', 'Mr. Iceman', 'attn: X\n\nDear X,\n'))
  1. attn: Mr. Iceman
  2. Dear Mr. Iceman,
  3. ('attn: Mr. Iceman\n\nDear Mr. Iceman,\n', 2)

re 模块和正则表达式的对象方法 split()对于相对应字符串的工作方式是类似的,但是与分割一个固定字符串相比,它们基于正则表达式的模式分隔字符串,为字符串分隔功能添加一些额外的威力。

如果给定分隔符不是使用特殊符号来匹配多重模式的正则表达式,那么 re.split()与str.split()的工作方式相同

  1. re.split(':', 'str1:str2:str3')
  2. DATA = (
  3. 'Mountain View, CA 94040',
  4. 'Sunnyvale, CA',
  5. 'Los Altos, 94023',
  6. 'Cupertino 95014',
  7. 'Palo Alto CA'
  8. )
  9. for item in DATA:
  10. print( re.split(', |(?= (?:\d{5}|[A-Z]{2})) ', item))
  1. ['str1', 'str2', 'str3']
  2. ['Mountain View', 'CA', '94040']
  3. ['Sunnyvale', 'CA']
  4. ['Los Altos', '94023']
  5. ['Cupertino', '95014']
  6. ['Palo Alto', 'CA']
  1. import os
  2. import re
  3. with os.popen('tasklist /nh', 'r') as f:
  4. for line in list(f)[:5]:
  5. # print(re.split(r'\s\s+|\t', line.rstrip())) #pid 和会话名未分解
  6. print(re.findall(r'([\w.]+(?: [\w.]+)*)\s\s*(\d+)\s(\w+)\s\s*(\d+)\s\s*([\d,]+\sK)', line.strip()))
  1. []
  2. [('System Idle Process', '0', 'Services', '0', '24 K')]
  3. [('System', '4', 'Services', '0', '2,852 K')]
  4. [('smss.exe', '364', 'Services', '0', '1,268 K')]
  5. [('csrss.exe', '612', 'Services', '0', '6,648 K')]

如下以一完整示例结束本文,它以不同的方式使用正则表达式来操作字符串。首先使用该脚本为正则表达式练习创建随机数据,然后将生成的数据提取其中的数字和邮箱地址

  1. from random import randrange, choice
  2. from string import ascii_lowercase as lc
  3. from datetime import datetime
  4. import time
  5. import re
  6. result_data = []
  7. # gen data
  8. tlds = ('com', 'cn', 'edu', 'net', 'gov', 'org')
  9. for i in range(randrange(4, 9)):
  10. max_seconds = int(datetime.now().timestamp())
  11. dtint = randrange(max_seconds)
  12. #dtstr = str(datetime.fromtimestamp(dtint))
  13. dtstr = ctime(dtint)
  14. llen = randrange(4, 8)
  15. login = ''.join(choice(lc) for j in range(llen))
  16. dlen = randrange(llen, 13)
  17. dom = ''.join(choice(lc) for j in range(dlen))
  18. result_data.append('%s::%s@%s.%s::%d-%d-%d' % (dtstr, login, dom, choice(tlds), dtint, llen, dlen))
  19. #print(result_data)
  20. #test re
  21. re_patt = '^(\w{3}).*::(?P<email>\w+@\w+.\w+)::(?P<number>\d+-\d+-\d+)'
  22. for item in result_data:
  23. m = re.match(re_patt, item)
  24. if m is not None:
  25. print('*'*30)
  26. print(item)
  27. print("Email: " + m.group('email'))
  28. print('Number: ' + m.group('number'))
  1. ******************************
  2. Tue Jan 28 15:34:09 1992::kzyoqsl@vwtddarzlyw.edu::696584049-7-11
  3. Email: kzyoqsl@vwtddarzlyw.edu
  4. Number: 696584049-7-11
  5. ******************************
  6. Thu Dec 23 22:35:52 1971::igqiuz@xiruxcy.org::62346952-6-7
  7. Email: igqiuz@xiruxcy.org
  8. Number: 62346952-6-7
  9. ******************************
  10. Sat Jan 25 11:26:50 2003::etutgz@yvpfclzx.com::1043465210-6-8
  11. Email: etutgz@yvpfclzx.com
  12. Number: 1043465210-6-8
  13. ******************************
  14. Wed Sep 28 23:37:34 1977::qxvuebc@bawmmefljm.com::244309054-7-10
  15. Email: qxvuebc@bawmmefljm.com
  16. Number: 244309054-7-10
  17. ******************************

Python数据分析学习-re正则表达式模块的更多相关文章

  1. Python数据分析学习目录

    python数据分析学习目录 Anaconda的安装和更新 矩阵NumPy pandas数据表 matplotlib-2D绘图库学习目录                      

  2. Python编程中 re正则表达式模块 介绍与使用教程

    Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...

  3. python基础之 re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  4. Python数据抓取_BeautifulSoup模块的使用

    在数据抓取的过程中,我们往往都需要对数据进行处理 本篇文章我们主要来介绍python的HTML和XML的分析库 BeautifulSoup 的官方文档网站如下 https://www.crummy.c ...

  5. Python数据存储:pickle模块的使用讲解

    在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间.Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象 ...

  6. python数据持久存储-pickle模块

    pickle模块实现了基本的数据序列和反序列化.pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,通过pickle模块的反序列化操作,能够从文件中创建上一次程序保存的对象. 接 ...

  7. Python数据分析学习(一)

    转摘:https://segmentfault.com/a/1190000015440560 一.数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seabor ...

  8. Python数据分析学习(二):Numpy数组对象基础

    1.1数组对象基础 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...

  9. Python数据分析学习(二)

    转摘:https://segmentfault.com/a/1190000015613967 本篇将继续上一篇数据分析之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目.结合两篇文章通过数据分 ...

随机推荐

  1. Android简介(一)

    Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...

  2. 算法-java代码实现堆排序

    堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...

  3. SpringMVC Hello(IDEA)

    以前一想要学习Java相关知识的时候,就会认为.NET FrameWork的相关技术还没学个通透还夹生饭.现在感觉只会.NET有些单一,需要多掌握几种开发技术,尽管.NET还没达到精通.貌似Hello ...

  4. Mysql Order By 字符串排序,mysql 字符串order by

    Mysql Order By 字符串排序,mysql 字符串order by ============================== ©Copyright 蕃薯耀 2017年9月30日 http ...

  5. Ios8之后, 定位的delegate不能触发的问题

    if([CLLocationManager locationServicesEnabled]){ self.locationManage = [[[CLLocationManager alloc] i ...

  6. javascript之this

    全局作用域的this this == window //true this.a = 8 window.a 一般函数的this function thisTest(){ return this; } t ...

  7. windows7 设定开关机事件

    动记录开关机的技能你知道吗? 下面跟我来设定一下记录电脑的开关机时间吧,工作常常会用到的. 在""我的电脑"右击=>管理=>系统工具=>时间查看器=&g ...

  8. 基于 HTML5 的 3D 工控隧道案例

    隧道的项目我目前是第一次接触,感觉做起来的效果还蛮赞的,所以给大家分享一下.这个隧道项目的主要内容包括:照明.风机.车道指示灯.交通信号灯.情报板.消防.火灾报警.车行横洞.风向仪.COVI.微波车检 ...

  9. js_4_函数

    js的函数是怎么定义的? function 函数名(形参1,......) { 函数体: return 返回值 :                                 //  可以没有返回 ...

  10. scrapy_开发环境

    scrapy开发所具备的环境 IDE         pycharm 数据库           mysql, redis 开发环境       python 3.5