Python高手之路【五】python基础之正则表达式

下图列出了Python支持的正则表达式元字符和语法:

字符点:匹配任意一个字符

import re
st = ‘python‘
result = re.findall(‘p.t‘,st)
print(result)

字符^:匹配以什么开头

import re
st = ‘python‘
result = re.findall(‘^py‘,st)
print(result)

字符$:匹配以什么结尾

import re
st = ‘python‘
result = re.findall(‘n$‘,st)
print(result)

字符*:匹配任意次,包括0次

import re
st = ‘I looooooove python‘
result = re.findall(‘lo*ve‘,st)#字符0可以没有,也可以无限多个,都可以匹配
print(result)

字符+:匹配一次或多次

import re
st = ‘I looooooove python‘
result = re.findall(‘lo+ve‘,st)#字符0没有就匹配不上
print(result)

字符?:匹配0次或一次

import re
st = ‘I love python‘
result = re.findall(‘lo?ve‘,st)#字符0没有也能匹配
print(result)

{m}:匹配前一个字符的m次

import re
st = ‘I loooove python‘
result = re.findall(‘o{3}‘,st)#匹配3个o字符
print(result)

{m,n}:匹配前一个字符的m-n次

import re
st = ‘I loooove python‘
result = re.findall(‘lo{1,4}ve‘,st)
print(result)

[abc]或[a-c]:匹配[]中的任意一个字符

import re
st = ‘I loooove python‘
result = re.findall(‘l[0-z]*e‘,st)
print(result)

[a|b]:匹配字符a或字符b

import re
st = ‘I lbve python‘
result = re.findall(‘l[a|b]ve‘,st)
print(result)

[^1-9]:[]里出现^字符,表示非的意思,并不表示以什么开头的意思

import re
st = ‘I lb2ve python6‘
result = re.findall(‘[^0-9]‘,st)
print(result)
##########################################
[‘I‘, ‘ ‘, ‘l‘, ‘b‘, ‘v‘, ‘e‘, ‘ ‘, ‘p‘, ‘y‘, ‘t‘, ‘h‘, ‘o‘, ‘n‘]

\:

  • 反斜杠后边跟元字符去除特殊功能
  • 反斜杠后边跟普通字符实现特殊功能
  • 引用序号对应的字组所匹配的字符串

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

import re
result = re.findall(r‘ab*‘,‘abbbc‘)
print(result)
##########################################
[‘abbb‘]
import re
result = re.findall(r‘ab*?‘,‘abbbc‘)#取消贪婪模式
print(result)
##########################################
[‘a‘]

re.match() 从头匹配

import re
origin = "hello poe bcd jet who are you 20"
r = re.match("h\w+",origin)
print(r.group())    #获取匹配到的所有结果
print(r.groups())   #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
()
{}
r = re.match("(h)(\w+)",origin)
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
(‘h‘, ‘ello‘)
{}
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
(‘h‘, ‘ello‘)
{‘n2‘: ‘ello‘, ‘n1‘: ‘h‘}

re.search() 浏览全部字符串,匹配第一个符合规则的字符串

与re.match()用法基本一样

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.search("p(\w+).*(?P<name>\d)$",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
poe bcd jet poe who are you 20
(‘oe‘, ‘0‘)
{‘name‘: ‘0‘}

re.findall() 将匹配的所有内容都放置在一个列表中

注:此方法空匹配也会保存到结果中,如:

result = re.findall("","a2b3c4d5")
print(result)
print(len(result))
##########################################
[‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘]

re.findall()方法要注意有分组的情况:

#没有分组的情况
r = re.findall("p\w+",origin)
print(r)
##########################################
[‘poe‘, ‘poe‘]
#有分组的情况,会把匹配到的分组放到结果列表中
r = re.findall("p(\w+)",origin)
print(r)
##########################################
[‘oe‘, ‘oe‘] 

re.finditer()

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.finditer("(p)(\w+(e))",origin)
for i in r :
    print(i.group())
    print(i.groups())
    print(i.groupdict()) 

re.split()

无分组情况,匹配到的字符串不会出现在匹配结果中:

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a\w+",origin,1)
print(r)
##########################################
[‘hello poe bcd jet poe who ‘, ‘ you 20‘]

有分组情况,匹配到的分组字符串也会出现在匹配结果中:

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a(\w+)",origin,1)
print(r)
##########################################
[‘hello poe bcd jet poe who ‘, ‘re‘, ‘ you 20‘]

re.sub() 正则替换

import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str = re.sub("\d+","KKK",origin,1)#参数1表示只替换匹配到的第一个字符串,如果是2表示替换匹配到的前2个字符串
print(new_str)
##########################################
KKKyiuoosfdKKKkuiuadf789v,xznfa978

re.subn()只是比re.sub()多返回一个数据,如:

import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str,count = re.subn("\d+","KKK",origin)#参数1表示只替换匹配到的第一个字符串
print(new_str,count)
##########################################
KKKyiuoosfdKKKkuiuadfKKKv,xznfaKKK 4

这个4表示替换匹配了4次

时间: 2024-12-29 18:46:26

Python高手之路【五】python基础之正则表达式的相关文章

Python高手之路【七】python基础之模块

本节大纲 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 1:模块介绍 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以

Python高手之路【一】初识python

Python简介 1:Python的创始人 Python (英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. Python社区的人赋予他"

python学习之路-1 python简介及安装方法

python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日. 语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进. 具有丰富和强大的库,底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快. 极其容易上手,因为Python有极其简单的说明文档. 免费.开源,是FLOSS(自由/开放源码软件)之一.使用者可以

Python学习之路3——Python用户交互及逻辑控制

1.Python用户交互 程序难免会与用户产生交互. 举个例子,你会希望获取用户的输入内容,并向用户打印出一些返回的结果.我们可以分别通过 input() 函数与 print 函数来实现这一需求. 1 #!/user/bin/env ptyhon 2 # -*- coding:utf-8 -*- 3 # Author: VisonWong 4 5 name = input("name:") 6 age = int(input("age:")) 7 job = inp

Python高手之路【八】python基础之requests模块

1.Requests模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. 在Python的世界里,事情不应该这么麻烦. Requests 使用的是 urllib3,因此继承了它的所有特性.Request

Python高手之路【三】python基础之函数

基本数据类型补充: set 是一个无序且不重复的元素集合 1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # r

Python高手之路【六】python基础之字符串格式化

Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator. 1.百分号

Python高手之路【九】python基础之迭代器与生成器

迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一

我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)

一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写. 实例变量:定义在方法中的变量,只作