正则表达式

正则表达式描述:

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个‘规则字符串’,这个‘规则字符串’用来
    表达对字符串的一种过滤逻辑。

  在线测试工具:http://tool.chinaz.com/regex/

  需要明确的是正则表达式只和字符串相关。

  正则表达式基础使用参考:http://tool.chinaz.com/regex/

re 模块中常用功能函数

1. compile()

编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

格式:

re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式

实例:

import re
s1 = 'have a good day.'
rr = re.compile("\w*oo\w*")
print(rr.findall(s1)) # 查看字符串中包含'oo'的单词 # 执行结果:
# ['good']

re_compile.py

2. match()

描述:
决定RE是否在字符串刚开始的位置匹配。

注意:
    这个方法并不是完全匹配,当pattern结束时,若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符 '$'
    
格式:

re.match(pattern, string, flags=0)

实例:

import re
s1 = 'runnicegoodrunbetterrun'
# rr = re.match('run', 'nicegoodrun better.run')
r1 = re.match('run', 'runnicegoodrunbetterrun').group()
r2 = re.match('run', 'Runnicegoodrunbetterrun', re.I).group() # re.I 忽视大小写 print('r1:', r1)
print('r2:', r2) # 执行结果:
# r1: run
# r2: Run

re_match.py

3. search()

re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

re.search(pattern, string, flags=0)

实例:

import re
s1 = 'run nice good run better rungood'
rr = re.search("good", s1).group() # 只会匹配到一个就直接返回
print(rr) # 执行结果:
# good

re_search.py

注意:
    match和search一旦匹配成功,就是一个 match object 对象,而match object对象有以下方法:

  • group()  返回被 RE 匹配的字符串
  • start()   返回匹配开始的位置
  • end()      返回匹配结束的位置
  • span()      返回一个元组包含匹配的位置
  • group()   返回 re 整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。

a.group()    返回re整体匹配的字符串
b.group(n, m)    返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()    groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,
元组中的元就是正则表达式中定义的组。

import re
a = "123abc456"
rr = re.compile("([0-9]*)([a-z]*)([0-9]*)")
print('group(0):', rr.search(a).group(0)) # group(0) 返回正则匹配到的全部内容
print('group(1):', rr.search(a).group(1)) # group(1) 列出第一个 ([a-z]*) 匹配到的部分
print('group(2):', rr.search(a).group(2)) # group(2) 列出第二个 ([0-9]*) 匹配到的部分
print('group(3):', rr.search(a).group(3)) # group(3) 列出第三个 ([0-9]*) 匹配到的部分
print('groups():', rr.search(a).groups()) # groups() 以元组的形式列出每个括号中匹配到的内容 # 执行结果:
# group(0): 123abc456
# group(1): 123
# group(2): abc
# group(3): 456
# groups(): ('123', 'abc', '456')

re_group.py

4. findall()

描述:
re.findall 遍历匹配,可以获得字符串中所有匹配的字符串,返回一个列表

格式:

re.findall(pattern, string, flags=0)

实例:

import re

p = re.findall("(\d+)", 'asdf12sdf123ad')   # 当匹配到多个值,以列表的形式返回
print(p) # 执行结果:
# ['12', '123'] import re tt = 'ggood booyy nice day'
print(re.findall("\w*oo\w*", tt))
print(re.findall("(\w)*oo(\w)", tt)) # 通过小括号分组,得到列表中的元组 # 执行结果:
# ['ggood', 'booyy']
# [('g', 'd'), ('b', 'y')]

re_findall.py

5. finditer()

描述:

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到RE匹配的所有部分,并把他们作为一个迭代器返回。

格式:

re.finditer(pattern, string, flags=0)

实例:

import re

iter = re.finditer('\d+', 'adfasdfq2313sdasf2qe4123')
for i in iter:
print(i) # finditer返回的是一个迭代器
print(i.group()) # 返回一组匹配到的部分
print(i.span()) # 返回一个元组包含匹配(开始,结束)的位置 # 执行结果:
# <_sre.SRE_Match object; span=(8, 12), match='2313'>
#
# (8, 12)
# <_sre.SRE_Match object; span=(17, 18), match='2'>
#
# (17, 18)
# <_sre.SRE_Match object; span=(20, 24), match='4123'>
#
# (20, 24)

re_finditer.py

6. split()

描述:

按照能够匹配的字串将 string 分割后返回列表。
可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

import re
print(re.split("\s+", 'nice to meeting you')) # 执行结果:
# ['nice', 'to', 'meeting', 'you']

格式:

re.split(pattern, string[, maxsplit])
maxsplit用于指定最大分割次数,不指定将全部分割。

实例:

import re
print(re.split('\d+','one1two2three3four4five5')) # 执行结果:
# ['one', 'two', 'three', 'four', 'five', ''] re.split 用法在这里要注意下:
当正则中使用分组和不使用分组返回的是不同的结果: import re
print(re.split('[a-z]','111a222'))
print(re.split('([a-z])','111a222')) # 执行结果:
# ['111', '222'] # 未使用分组
# ['111', 'a', '222'] # 使用分组

re_split.py

通过上面的例子,我们可以看到未使用分组和使用分组的不同,这里总结一下:

当正则未使用分组(正则未带小括号)时,按照匹配到的部分进行切割,且匹配到的部分不会出现在结果列表中
当正则使用分组(正则带小括号)时,按照匹配到的部分进行切割,匹配到的部分作为元素出现在列表中,且匹配到值的索引按照奇数位出现1、3、5、7...

灵活的使用分组会带来很多的便捷,后面编写计算器的代码中就会用到。

7. sub()

使用re替换string中每一个匹配的子串后返回替换后的字符串

格式:

re.sub(pattern, repl, string, count)

默认全部替换

实例:

import re
s1 = '1 + 2 + (4 / 5 + 2)' print(re.sub(' ', '', s1)) # 直接去除计算表达式中的空格 # 执行结果:
# 1+2+(4/5+2)

re_sub.py

8. subn()

描述:

返回元组类型,最后一位为替换的次数

格式:

subn(pattern, repl, string, count=0, flags=0)

实例:

import re
s1 = '1 + 2 + (4 / 5 + 2)' print(re.subn(' ', '', s1)) # 直接去除计算表达式中的空格 # 执行结果:
# ('1+2+(4/5+2)', 9) # 替换了9次空格

re_subn.py

re模块方法区分

1. re.match与re.search与re.findall的区别:

re.match     只是匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
re.search     匹配整个字符串,直到直到一个匹配。

import re
s1 = 'abc123'
print(re.match("[\d]", s1)) # 从头开始搜索数字,如果开始没有匹配到返回None
print(re.search("[\d]", s1).group()) # 从头开始搜索数字,匹配到第一个直接返回一个迭代器
print(re.findall("[\d]", s1)) # 遍历查找字符串中的数字部分,查找到每个数字都以元素的形式展现 # 执行结果:
# None
#
# ['1', '2', '3']

re_match_search.py

2. 贪婪匹配和非贪婪匹配

*?,+?,??,{m,n}?    前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

实例1:

import re
a = re.findall(r"a(\d+?)",'a23b') # 在正则后面加'?',表示惰性匹配,匹配到一个就直接返回
print(a)
b = re.findall(r"a(\d+)",'a23b') # 贪婪匹配
print(b) # 执行结果:
# ['2']
# ['23']

实例1

实例2:

a = re.match('<(.*)>','<H1>title<H1>').group()
print(a)
b = re.match('<(.*?)>','<H1>title<H1>').group()
print(b) # 执行结果:
# <H1>title<H1>
# <H1>

实例2

实例3:

a = re.findall(r"a(\d+)b",'a3333b')
print(a)
b = re.findall(r"a(\d+?)b",'a3333b')
print(b) # 执行结果:
# ['3333']
# ['3333']

实例3

参考链接:
    https://www.cnblogs.com/tina-python/p/5508402.html
    http://tool.chinaz.com/regex/
    http://www.cnblogs.com/Eva-J/articles/7228075.html#_label10

[ python ] 正则表达式及re模块的更多相关文章

  1. python正则表达式之re模块方法介绍

    python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...

  2. Python正则表达式与re模块介绍

    Python中通过re模块实现了正则表达式的功能.re模块提供了一些根据正则表达式进行查找.替换.分隔字符串的函数.本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景. 正则表达式基 ...

  3. python 正则表达式 (重点) re模块

    京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示.假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误.这个功能是怎么实现的呢?假如现在你用python写一段 ...

  4. Python正则表达式与hashlib模块

    菜鸟学python第十六天 1.re模块(正则表达式) 什么是正则表达式 正则表达式是一个由特殊字符组成的序列,他能帮助对字符串的某种对应模式进行查找. 在python中,re 模块使其拥有全部的正则 ...

  5. python正则表达式与re模块-02

    正则表达式 正则表达式与python的关系 # 正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则 # 但要在python中使用正则表达式,就必须依赖于python内置 ...

  6. python 正则表达式re使用模块(match()、search()和compile())

    摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...

  7. Python正则表达式与re模块

    在线正则表达式测试 http://tool.oschina.net/regex/ 常见匹配模式 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 [\ ...

  8. python 正则表达式与re模块

    一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在 ...

  9. Python 正则表达式、re模块

    一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...

随机推荐

  1. BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】

    题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...

  2. 洛谷 P3241 [HNOI2015]开店 解题报告

    P3241 [HNOI2015]开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱. 这样的想法当然非 ...

  3. 代码收藏系列--mysql--创建数据库、数据表、函数、存储过程命令

    创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_c ...

  4. JSP2 特性

    JSP2 新特性 1.直接配置 JSP 属性 2.表达式语言 3.简化的自定义标签 API 4.Tag 文件语法 如果要使用 JSP2 语法,web.xml 文件必须使用 Servlet2.4 以上版 ...

  5. hexo搭建个人博客

    本文讲述如何用`hexo`搭建个人博客,并托管到`github`.不需要租赁服务器,可完成网站博客的搭建. 安装Hexo安装hexo之前,要先下载安装Node.js和Git,百度搜索找到下载即可.[G ...

  6. python自学笔记(一)

    我没学过python,通过网上和一些图书资料,自学并且记下笔记. 很多细节留作以后自己做项目时再研究,这样能更高效一些. python基础自学笔记 一.基本输入和输出 pthon3.0用input提示 ...

  7. OpenCV---图像加载与保存

    一:获取图像的信息 什么是图像: 结构化存储的数据信息 图像属性: -通道数目 -高与宽 -像素数据 -位图深度 import cv2 as cv def get_image_info(image): ...

  8. 超酷动态图片展示墙JS特效制作方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 拦截asp.net输出流做处理

    本文标题是指对已经生成了HTML的页面做一些输出到客户端之前的处理. 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面 ...

  10. Try finally的一个实验和为什么避免重载 finalize()方法--例子

    public class TryFinallTest { public TryFinallTest(){ } public void runSomething(String str){ System. ...