在Python中使用正则表达式的方法


Posted in Python onAugust 13, 2015

正则表达式(regular expression)是一种用形式化语法描述的文本匹配模式。在需要处理大量文本处理的应用中有广泛的使用,我没使用的编辑器,IDE中的搜索常用正则表达式作为搜索模式。玩过*nix系统的都知道如sed,grep,awk这类的命令,他们是非常强大的文本处理工具。几乎所有的语言都有对正则表达式的支持,有的直接在语法中支持,有的使用扩展库的形式。python使用的就是扩展库re。

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

    搜索文本中的匹配的模式是最常用的.以模式和文本作为输入,如果有匹配则返回一个Match对象,反之返回None。
    每个Match对象包括相关的匹配信息:原字符串、正则表达式和匹配的文本在字符串中的位置。
import re 
pattern = "this" 
text = "Does this text match the pattern?" 
match = re.search(pattern, text) # 返回一个Match对象 
print match.re.pattern # 要匹配的正则表达式"this"
print match.string   # 匹配的文本"Does this match the pattern?" 
print match.start()   # 匹配的开始位置 5
print match.end()    # 匹配的结束位置 9

    re.compile(pattern,flag=0)
    如果程序中频繁的使用到同一个正则表达式,每次使用的时候都写一遍正则表达式不仅不高效而且会大大增加出错的几率,re提供了compile函数将一个表达式字符串编译为一个RegexObject。
    模块级函数会维护已编译表达式的一个缓存,而这个缓存是的大小是有限制的。直接使用已经编译的表达式可以避免缓存查找的开销,并且在加载模块时就会预编译所有的表达式。

import re 
regex = re.compile("this") 
text = "Does this text match the pattern?" 
match = regex.search(text) 
if match: 
  print "match" 
  match.group(0)  #返回匹配的字符串  
else:
  print "not match"

    re.findall(pattern, string, flag=0)
    使用search会返回匹配的单个实例,使用findall会返回所有匹配的不重叠的子串。

import re 
pattern = 'ab' 
text = 'abbaaabbbbaaaaaa' 
re.findall(pattern, text)  # 返回['ab', 'ab']

    re.finditer(pattern, string, flag=0)
    finditer会返回一个迭代器,会生成Match实例,不像findall()返回字符串.

import re 
pattern = 'ab' 
text = 'abbaaabbbbaaaaaa' 
match = re.finditer(pattern, text)  
for m in match:
  print m.start() 
  print m.end()

以上的例子会分别输出两次匹配结果的起始位置和结束位置。

正则匹配默认采用的是贪婪算法,也就是说会re在匹配的时候会利用尽可能多的输入,而使用?可以关闭这种贪心行为,只匹配最少的输入。这之前先说下量词。

量词是为了简化正则表达式的读写而定义的,通用的形式是{m,n},这表示匹配的个数至少是m,最多是n,在','之后不能有空格,否则会出错,并且均为闭区间。

  •     {n} 之前的元素必须出现n次
  •     {m,n} 之前元素最少出现m次,最多n次
  •     {m,} 之前的元素最少出现m次,无上限
  •     {0,n} 之前的元素可以不出现,也可以出现,出现的话最多出现n次

除了之上,还有三个常用的量词*,?和+

  •     * 等价于{0,}
  •     + 等价于{1,}
  •     \? 等价于{0,1}

还有^和$,分别表示段或者字符串的开始与结束。

import re 
re.search("^travell?er$", "traveler")  # True 
re.search("^travell?er$", "traveller")  # True  
re.search("^ab\*", "abbbbbbb")      # True,返回"abbbbbbb" 
re.search("^ab\*?", "abbbbbbb")     # True,返回"a" 
re.search("^ab+", "abbbbbbb")      # True,返回"abbbbbbb" 
re.search("^ab+?", "abbbbbbb")      # True,返回"ab"

对于一些预定义的字符集可以使用转义码可以更加紧凑的表示,re可以识别的转义码有3对,6个,分别为三个字母的大小写,他们的意义是相反的。

  •     \d : 一个数字
  •     \D : 一个非数字
  •     \w : 字母或者数字
  •     \W : 非字母,非数字
  •     \s : 空白符(制表符,空格,换行符等)
  •     \S : 非空白符

如果想指定匹配的内容在文本的相对位置,可以使用锚定,跟转义码类似。

  •     ^ 字符或行的开始
  •     $ 字符或行的结束
  •     \A 字符串的开始
  •     \Z 字符串结束
  •     \b 一个单词开头或者末尾的空串
  •     \B 不在一个单词开头或末尾的空串
import re
the_str = "This is some text -- with punctuation" 
re.search(r'^\w+', the_str).group(0)    # This
re.search(r'\A\w+', the_str).group(0)   # This 
re.search(r'\w+\S*$', the_str).group(0)  # punctuation 
re.search(r'\w+\S*\Z', the_str).group(0)  # punctuation 
re.search(r'\w*t\W*', the_str).group(0)  # text -- 
re.search(r'\bt\w+', the_str).group(0)   # text 
re.search(r'\Bt*\B', the_str).group(0)   # 没有匹配

用组来解析匹配,简单的说就是在一个正则表达式中有几个小括号()将匹配的表达式分成不同的组,使用group()函数来获取某个组的匹配,其中0为整个正则表达式所匹配的内容,后面从1开始从左往右依次获取每个组的匹配,即每个小括号中的匹配。使用groups()可以获取所有的匹配内容。

import re 
the_str = "--aabb123bbaa" 
pattern = r'(\W+)([a-z]+)(\d+)(\D+)' 
match = re.search(pattern, the_str)  
match.groups()  # ('--', 'aabb', '123', 'bbaa') 
match.group(0)  # '--aabb123bbaa' 
match.group(1)  # '--' 
match.group(2)  # 'aabb' 
match.group(3)  # '123' 
match.group(4)  # 'bbaa'

python对分组的语法做了扩展,我们可以对每个分组进行命名,这样便可以使用名称来调用。语法:(?P<name>pattern),使用groupdict()可以返回一个包含了组名的字典。

import re 
the_str = "--aabb123bbaa" 
pattern = r'(?P<not_al_and_num>\W+)(?P<al>[a-z]+)(?P<num>\d+)(?P<not_num>\D+)' 
match = re.search(pattern, the_str)  
match.groups()  # ('--', 'aabb', '123', 'bbaa') 
match.groupdict() # {'not_al_and_num': '--', 'not_num': 'bbaa', 'num': '123', 'al': 'aabb'} 
match.group(0)          # '--aabb123bbaa' 
match.group(1)          # '--' 
match.group(2)          # 'aabb' 
match.group(3)          # '123' 
match.group(4)          # 'bbaa'  
match.group('not_al_and_num')  # '--'
match.group('al')         # 'aabb' 
match.group('num')        # '123' '
match.group('not_num')      # 'bbaa'

以上的group()方法在使用的时候需要注意,只有在有匹配的时候才会正常运行,否则会抛错,所以在不能保证有匹配而又要输出匹配结果的时候,必须做校验。

在re中可以设置不通的标志,也就是search()和compile()等中都包含的缺省变量flag。使用标志可以进行完成一些特殊的要求,如忽略大小写,多行搜索等。

import re 
the_str = "this Text" 
re.findall(r'\bt\w+', the_str)  # ['this'] 
re.findall(r'\bt\w+', the_str, re.IGNORECASE) # ['this', 'Text']

 

Python 相关文章推荐
Python tempfile模块学习笔记(临时文件)
May 25 Python
python with statement 进行文件操作指南
Aug 22 Python
python 读写中文json的实例详解
Oct 29 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python实现Virginia无密钥解密
Mar 20 Python
超简单使用Python换脸实例
Mar 27 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
python中pyplot基础图标函数整理
Nov 10 Python
python实现银行账户系统
Feb 22 Python
Python Pandas常用函数方法总结
Jun 15 Python
简单讲解Python中的闭包
Aug 11 #Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 #Python
python实现web方式logview的方法
Aug 10 #Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 #Python
python用10行代码实现对黄色图片的检测功能
Aug 10 #Python
详解Python中dict与set的使用
Aug 10 #Python
分析并输出Python代码依赖的库的实现代码
Aug 09 #Python
You might like
PHP中的日期处理方法集锦
2007/01/02 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
一个JQuery操作Table的代码分享
2012/03/30 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
代码详解javascript模块加载器
2018/03/04 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
简单学习Python多进程Multiprocessing
2017/08/29 Python
用python生成1000个txt文件的方法
2018/10/25 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
教师自我评价范例
2013/09/24 职场文书
网上书店创业计划书
2014/01/12 职场文书
网络优化专员求职信
2014/05/04 职场文书
师德师风剖析材料
2014/09/30 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python