python正则模块re

  python中re中内置匹配、搜索、替换方法见博客---python附录-re.py模块源码(含re官方文档链接)

  正则的应用是处理一些字符串,phthon的博文python-基础学习篇(二)中提到了字符串类型有一些字符串内置的处理方法,但是需要了解一点内置方法是适用于一些简单字符串的处理,复杂的字符串处理方法还是正则表达式的天下。至于为啥要整一些内置方法,我个人认为对于一些简单应用中的字符串处理,无需使用一个整体的系统的正则知识,同时也是python易入门的体现。

  python中的正则内置于re模块中,使用正则之前需要导入re模块。

import re

  有了之前的正则表达式的基础,我们可以写出一些正则表达式(pattern)了,如何使用正则表达式去处理字符串(string)呢?只能通过re模块中内置的几个方法去操作。

  re模块内置的函数方法

  re.compile(pattern, flags=0)

  re.compile()方法可以把一个正则表达式编译成一个正则对象(PatternObj),返回的正则对象是操作其他处理字符串方法的主体。

pattern_obj = re.compile(pattern)
match_obj = pattern_obj.compile(string)

  等同于

match_obj = re.match(pattern,string)

  实际上re.match()处理流程内含re.compile()的过程。match方法源码:

def match(pattern, string, flags=0):
"""Try to apply the pattern at the start of the string, returning
a Match object, or None if no match was found."""
return _compile(pattern, flags).match(string)

  可以看出match方法返回的实际就是正则对象pattern_obj调用match()方法的结果。

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

  re.search()方法是搜索整个字符串,找到第一个符合正则规则的字符串部分,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。

 import re

 pattern = r'the'
match_obj = re.search(pattern, 'The dog is eating the bone', re.I)
print(match_obj.group(0))
print(match_obj) # The
# <re.Match object; span=(0, 3), match='The'>

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

  re.match()方法是从字符串开始位置匹配整个字符串,当从字符串开始成功匹配到部分字符内容,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。

 import re

 pattern = r'the'
match_obj = re.match(pattern, 'Dog is eating the bone', re.I)
print(match_obj) # None

  对比

 import re

 pattern = r'the'
match_obj = re.match(pattern, 'The dog is eating the bone', re.I)
print(match_obj.group(0))
print(match_obj) # The
# <re.Match object; span=(0, 3), match='The'>

  re.search()和re.match()区别对比:位置上,search()方法可以从字符串任意位置匹配部分字符串内容,match()方法必须从字符串开始位置匹配字符串内容,一旦开头匹配不成,则匹配失败;内容上,search()方法是非贪婪匹配,只要找到第一个符合正则规则的部分字符串就返回匹配对象,match()方法则是按照正则规则只匹配字符串开始位置的部分字符串;多行模式下,match()方法依旧只会匹配字符串的开始位置,而search()方法和“^”联合使用则是从多行的每一行开始匹配。

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

  re.fullmatch()相似于re.match()是从字符串开始位置开始匹配,re.match()是匹配字符串部分或者全部,而re.fullmatch()是匹配字符串的全部,当且仅当正则表达式匹配整个字符串内容的时候,返回一个匹配对象MatchObject,否则返回None。

  re.split(pattern, string, maxsplit=0, flags=0)

  re.split()表示对字符串string,按照正则表达式pattern匹配内容分隔字符串,其中maxsplit是指最大分隔次数,最大分隔次数应该是小于默认分隔次数的。分隔后的字符串内容组成列表返回。

 import re

 split_list_default = re.split(r'\W+', 'Words, words, words.')
print(split_list_default) # ['Words', 'words', 'words', ''] 正则表达式\W+表示以一个或多个非单词字符对字符串分隔,分隔后组成列表的形式返回,注意列表后空字符串为'.'和之前的words分隔结果 split_list_max = re.split(r'\W+', 'Words, words, words.', 1)
print(split_list_max) # ['Words', 'words, words.'] 指定分隔次数,字符串分隔会由左至右按照maxsplit最大分隔次数分隔,实际最大分隔次数是小于等于默认分隔次数的 split_list_couple = re.split(r'(\W+)', 'Words, words, words.')
print(split_list_couple) # ['Words', ', ', 'words', ', ', 'words', '.', ''] 正则表达式中存在分组情况,即捕获型括号,(\W+)会捕获字符串中‘, ’并添加至列表一起显示出来

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

  re.findall()类似于re.search()方法,re.search()是在字符串中搜索到第一个与正则表达式匹配的字符串内容就返回一个匹配对象MatchObject,而re.findall()方法是在字符串中搜索并找到所有与正则表达式匹配的字符串内容,组成一个列表返回,列表中元素顺序是按照正则表达式在字符串中由左至右匹配的返回;未匹配成功,返回一个空列表。

import re

pattern = r'\d{3}'
find = re.findall(pattern, 'include21321exclude13243alert213lib32')
print(find) # ['213', '132', '213']

  注意:当re.findall()中的正则表达式存在两个或两个以上分组时,按照分组自左向右的形式匹配,匹配结果按照顺序组成元组,返回列表中元素以元组的形式给出。

import re

pattern = r'(\d{3})(1)'
find = re.findall(pattern, 'include21321exclude13243alert213lib32')
print(find) # [('132', '1')]

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

  re.finditer()相似于re.findall()方法,搜索字符串中所有与正则表达式匹配的字符串内容,返回一个迭代器Iterator,迭代器Iterator内保存了所有匹配字符串内容生成的匹配对象MatchObject。即匹配文本封装在匹配对象MatchObject中,多个匹配对象MatchObject保存在一个迭代器Iterator中。

import re

pattern = r'\d{3}'
find = re.finditer(pattern, 'include21321exclude13243alert213lib32')
print(find)
for i in find:
print(i)
print(i.group(0)) # <callable_iterator object at 0x00000000028FB0F0>
# <re.Match object; span=(7, 10), match='213'>
#
# <re.Match object; span=(19, 22), match='132'>
#
# <re.Match object; span=(29, 32), match='213'>
#

  re.sub(pattern, repl, string, count=0, flags=0)

  re.sub()表示用正则表达式匹配字符串string中的字符串内容,使用repl参数内容替换匹配完成的字符串内容,返回替换后的字符串。参数count指定替换次数,正则表达式匹配字符串是由左至右的,可能匹配多个内容,替换操作也是自左向右替换,如果只想替换左边部分匹配内容可以设置count参数,参数值为非负整数且小于等于最大匹配成功个数;未匹配成功,不做替换,返回原字符串。

import re

pattern = r'\d+'
find_default = re.sub(pattern, ' ', 'include21321exclude13243alert213lib32')
print(find_default) find_count = re.sub(pattern, ' ', 'include21321exclude13243alert213lib32', 2)
print(find_count) # include exclude alert lib
# include exclude alert213lib32

  注意:repl参数内容可以是字符串也可以是函数,如果repl是函数,要求这个函数只能有一个匹配对象MatchObject参数,将匹配成功后生成的匹配对象传入函数处理后拼接到原字符串返回。

import re

def replace_func(match_obj):
if match_obj.group(0).isdigit():
return ' '
else:
return '-' pattern = r'\d+'
find_default = re.sub(pattern, replace_func, 'include21321exclude13243alert213lib32')
print(find_default) # include exclude alert lib

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

  re.subn()与re.sub()作用相同,只在返回结果有所差别,re.sub()返回是替换后的字符串,而re.subn()返回是一个由替换后的字符串和替换次数组合成的元组。

import re

def replace_func(match_obj):
if match_obj.group(0).isdigit():
return ' '
else:
return '-' pattern = r'\d+'
find_default = re.subn(pattern, replace_func, 'include21321exclude13243alert213lib32')
print(find_default) # ('include exclude alert lib ', 4)

  re.escape(pattern)

  转义正则表达式中可以产生特殊含义的字符,主要用于匹配文本字符串中含有正则表达式的情形。

import re

result = re.escape('\d*')
print(result) # \\d\*

  re.purge()

  清除正则表达式缓存

  参数flags

  上述方法中含有默认参数flags=0,可以通过函数的调用为flags指定特殊的参数值来指定匹配模式。常用参数值有:

  re.I(re.IGNORECASE),不区分大小写模式;

  re.M(re.MULTILINE),多行模式;

  re.S(re.DOTALL),单行模式;

  re.X(re.VERBOSE),注释模式;

  正则对象(Pattern)

  正则对象可以使用直接调用上述方法,在re.match()方法中有所描述。由match()方法到subn()方法都是正则对象Pattern的实例方法,正则对象Pattern的实例属性有:

  Pattern.flags

  指定或获取匹配模式,如:Pattern.flags = re.I,但是一般不直接操作实例属性,由实例方法操作实例属性,故该属性多用于获取匹配模式。

  Pattern.groups

  获取捕获分组的数量。

  Pattern.pattern

  获取原始正则表达式

  匹配对象(MatchObject)

  匹配对象是对匹配内容的封装。

  MatchObject.group(num)

  获取匹配对象中封装的匹配内容,group(0)表示获取全部内容,大于等于1表示获取对应捕获分组中的内容。

import re

pattern = r'(\w+) (\w+)'
match_obj = re.match(pattern, 'Snow Stack')
print(match_obj.group(0))
print(match_obj.group(1))
print(match_obj.group(2)) # Snow Stack
# Snow
# Stack

  MatchObject.__getitem__(num)

  作用同MatchObject.group(num)。

import re

pattern = r'(\w+) (\w+)'
match_obj = re.match(pattern, 'Snow Stack')
print(match_obj[0])
print(match_obj[1])
print(match_obj[2]) # Snow Stack
# Snow
# Stack

  MatchObject.groups()

  以元组的形式返回所有捕获分组内容,只返回捕获分组中的内容,不包含其他匹配内容。

import re

pattern = r'(\w+) (\w+)'
match_obj = re.match(pattern, 'Snow Stack')
print(match_obj.groups()) # ('Snow', 'Stack')

  MatchObject.groupdict()

  返回一个字典,包含了所有的命名子组。key就是组名,value就是捕获分组匹配的内容。

import re

pattern = r'(?P<first_name>\w+) (?P<last_name>\w+)'
match_obj = re.match(pattern, 'Snow Stack')
print(match_obj.groupdict()) # {'first_name': 'Snow', 'last_name': 'Stack'}

认识python正则模块re的更多相关文章

  1. python:正则模块

    1,正则表达式 正则表达式是用来做字符串的匹配的,正则有他自己的规则,和python没有关系,一种匹配字符串的规则. 2,字符组 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表 ...

  2. 19 Python 正则模块和正则表达式

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  3. Python——正则模块

    1.re模块是用来操作正则表达式 2.正则表达式——用来字符串匹配的 (1)字符组:[字符组]  例如[0123fdsa456*/-] [0-9] 等同于[0123456789] [a-z] 匹配小写 ...

  4. Python正则模块

    re模块 import re # match # 从头开始匹配, 只匹配一次,就结束 a = re.match('\d+', '54:58天5488:8451') # 默认就是0个群组 print(a ...

  5. Python全栈开发【re正则模块】

    re正则模块 本节内容: 正则介绍 元字符及元字符集 元字符转义符 re模块下的常用方法 正则介绍(re) 正则表达式(或 RE)是一种小型的.高度专业化的编程语言. 在Python中,它内嵌在Pyt ...

  6. 小白的Python之路 day5 re正则模块

    re正则模块 一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串 ...

  7. Python 正则处理_re模块

    正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...

  8. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  9. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

随机推荐

  1. Linux中逻辑卷(LVM)管理基本操作

    1.创建逻辑卷 原文:https://linux.cn/article-3965-1.html

  2. .NET基础 (14)管理文件和文件夹的类型

    管理文件和文件夹的类型1 如何操作文件和文件夹2 如何实现文件和文件夹的监控功能 管理文件和文件夹的类型1 如何操作文件和文件夹 .NET内建类中提供了FileInfo和DictionaryInfo两 ...

  3. MFC中的DLL、LIb文件的创建、使用

     动态链接库Dynamic-Linked Lib 的创建与使用 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软 ...

  4. [翻译] FastReport Class Hierarchy (FastReport 组件类层次结构)

    "TfrxComponent" is the base class for all FastReport components. Objects of this type have ...

  5. 从数据池中捞取的存储过程控件使用完以后必须unprepare

    从数据池中捞取的存储过程控件使用完以后必须unprepare,否则会造成输入参数是仍是旧的BUG. 提示:动态创建的存储过程控件无此BUG.此BUG只限于从数据池中捞取的存储过程控件. functio ...

  6. XML--使用XML来将字符串分隔成行数据

    DECLARE @xml XML SET @xml=CAST(REPLACE('<ROOT><X>'+'AA,AB,AC,AD'+'</X></ROOT> ...

  7. Devexpress GridControl无限高度惹得祸

    异常提示: issue, place the grid into a container that will give a finite height to the grid, or manually ...

  8. ASP.NET MVC学习(一)

    这几天在学习asp.net mvc 一上来就被书中的什么依赖注入,什么单元测试搞的晕晕呼呼,根本就不理解,前天开始做书中的运动商店项目,一上来就遇到个大难题,书中的连接字符串的写法,跟以往在winfo ...

  9. 3-C#面向对象概念

    本篇博客对应视频讲解 回顾 前两篇博文带大家快速的感知一下使用C#编写程序是怎样的过程,能实现什么样的功能.同时也提到了面向对象的概念.本篇文章就是更加详细的去将面向对象编程中常见的概念进行示例说明, ...

  10. @JoinColumn 详解

    1. 一对一 现假设有Person表和Address表,是一对一的关系,在Person中有一个指向Address表主键的字段addressID,所以主控方一定是Person,所谓主控方就是能改变关联关 ...