Python开发【第一篇】Python基础之正则表达式补充

正则表达式

一简介:
就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的标称语言,
(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被
编译成一系列的字节码,然后由用C编写的匹配引擎执行。

先导入后执行:
import re

二、字符匹配:

字符匹配(普通字符,元字符):
普通字符:大多数字符和字母都会和自身匹配
>>> re.findall(‘alex‘,‘yuanaleSxalexwupeiqi‘)
[‘alex‘]

2元字符:. ^ $ * + ? {} [] | () \

我们首先考察的元字符是“[”和"]"。它们常用来指定一个字符类别,所有字符类
别就是你想匹配的一个字符集。字符可以单个列出,也可以用“-”号分隔的两个给定
字符来表示一个字符区间。例如,[abc]将匹配“a”,"b",或"c"中的任意一个字符;
也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写
字母,那么RE应写成[a-z].
元字符在类别里并不起作用。例如,[akm$]将匹配字符"a","k","m",或"$"中
的任意一个;"$"通常用作元字符,但在字符类别中,其特性被除去,恢复成普通字符。

():
#!python
>>> p = re.compile(‘(a(b)c)d‘)
>>> m = p.match(‘abcd‘)
>>> m.group(0)
‘abcd‘
>>> m.group(1)
‘abc‘
>>> m.group(2)
‘b‘
[]:元字符[]表示字符类,在一个字符类中,只有字符^、-、]和\有特殊含义。
字符\仍然表示转义,字符-可以定义字符范围,字符^放在前面,表示非.

. 匹配到换行符之外得任何一个字符
+ 匹配+号前内容1次至无限次
? 匹配?号前内容0次到1次
{m} 匹配前面的内容m次
{m,n} 匹配前面的内容m到n次
*?,+?,??,{m,n}? 前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

从前面的描述可以看到‘*‘,‘+‘和‘*‘都是贪婪的,但这也许并不是我们说要的,
所以,可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的RE。示例,
体会两者的区别:
>>> re.findall(r"a(\d+?)","a23b") #非贪婪模式
[‘2‘]
>>> re.findall(r"a(\d+)","a23b")
[‘23‘]

>>> re.search(‘<(.*)>‘, ‘<H1>title</H1>‘).group()
‘<H1>title</H1>‘
re.search(‘<(.*?)>‘, ‘<H1>title</H1>‘).group()
‘<H1>‘

注意比较这种情况:
>>> re.findall(r"a(\d+)b","a23b")
[‘23‘]
>>> re.findall(r"a(\d+?)b","a23b") #如果前后均有限定条件,则非匹配模式失效

\:
反斜杠后边跟元字符去除特殊功能。
反斜杠后边跟普通字符实现特殊功能。
引用序号对应的字组所匹配的字符串。
re.search(r"(alex)(eric)com\2","alexericcomeric")

\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类[^0-9]。
\s 匹配任何空白字符;它相当于类[\t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类[^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类[a-zA-Z0-9]。
\W 匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9]。
\b: 匹配一个单词边界,也就是指单词和空格间的位置。
匹配单词边界(包括开始和结束),这里的“单词”,是指连续的字母、数字和下划线租场的字符串。注意\b的定义是\w和\W的交界,
这是个零宽界字符(zero-width assertions)只用以匹配单词的词首和词尾。
单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的。

r是按照原生字符来匹配。
>>> re.findall(‘I‘,‘I am hanIsome‘)
[‘I‘, ‘I‘]
>>> re.findall(r‘I\b‘,‘I am hanIsome‘)
[‘I‘]
>>> re.findall(r‘I\b‘,‘I&am hanIsome‘)
[‘I‘]

练习:

匹配除换行符以外的任意字符:
re.findall(‘al.x‘,‘yuanaleSxalexwupeiqi‘)
^起始位置匹配:
re.findall(‘^al.x‘,‘alexyuanaleSxalexwupeiqi‘
$末尾位置匹配:

*匹配0到多次:
re.findall(‘al.*x‘,‘yuanaleSxalexwupeiqi‘)
匹配+号前内容1次至无限次:
re.findall(‘al.+x‘,‘yuanaleSxaleexwupeiqi‘)
匹配?号前内容0次到1次:
re.findall(‘al.?x‘,‘yuanaleSxalxwupeiqi‘)
re.findall(‘al.?x‘,‘yuanaleSxalwxwupeiqi‘)
匹配前面的内容m到n次:
re.findall(‘al.{1,5}x‘,‘yuanSxalweeeexwupeiqi‘)
re.findall(‘ald{,6}x‘,‘yuanSxalddddddxwupeiqi‘)(注:匹配前面的d,0到6次)
[]匹配:
re.findall(‘a[bc]d‘,‘abd‘)
re.findall(‘a[a-c]d‘,‘abd‘)
re.findall(‘a[a-z]+d‘,‘agbd‘)
re.findall(‘a[a*]d‘,‘a*d‘) (注:特殊)
re.findall(‘a[1-9]d‘,‘a4d‘)
^尖角符在[]是非:
re.findall(‘a[^f]d‘,‘abd‘)
\匹配:
re.findall(‘a[\d]d‘,‘a2d‘)(注:\d代表数字的意思)
re.findall(‘a\wd‘,‘a_d‘)(注:包括下划线)
re.findall(r‘I\b‘,‘I am hanIsome‘)(用到了原生字符r匹配空格)

三、函数

1)
match: re.match(pattern, string, flags=0)
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
#.group()是拿到匹配到得值,是match的一个方法。
re.match(‘com‘,‘comwww.runcomoob‘).group()
re.match(‘com‘,‘Comwww.runComoob‘,re.I).group()

2)
search:re.search(pattern,string,flags=0)
re.search(‘\dcom‘,‘www.4comrunoob.5com‘).group()

注意:
findall 是应用最广得。
re.match(‘com‘,‘comwww.runcomoob‘)
re.search(‘\dcom‘,‘www.4comrunoob.5com‘)
一旦匹配成功,就是一个match object 对象,而match object对象拥有以下方法:
group()返回被 RE 匹配的字符串
start()返回匹配开始的位置
end()返回匹配结束的位置
span()返回一个元组包含匹配(开始,结束)的位置
group()返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
1. group()返回re整体匹配的字符串。
2. group (n,m)返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
3.groups()groups()方法返回一个包含正则表达式中所有小组字符串的元组,从1到所含的小组好,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
import re
a = "123abc456"
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456

group(1)列出第一个括号匹配部门,group(2)列出第二个括号匹配部分,group(3)列出第三个括号匹配部分。

3)
findall:
re.findall 以列表形式返回所有匹配的字符串
re.findall 可以获取字符串中所有匹配的字符串。如:

p = re.compile(r‘\d+‘)
print p.findall(‘one1two2three3four4‘)

re.findall(r‘\w*oo\w*‘, text);获取字符串中,包含‘oo‘的所有单词。

import re
text = "JGood is a handsome boy, he is handsome and cool,clever,and so on ...."
print re.findall(r‘\w*oo\w*‘,text) #结果:[‘JGood‘,‘cool‘]
#print re.findall(r‘(\w)*oo(\w)*‘,text) # ()表示子表达式 结果:[(‘G‘,‘d‘),(‘c‘,‘l‘)]

finditer():

>>> p = re.compile(r‘\d+‘)
>>> iterator = p.finditer(‘12 drumm44ers drumming, 11... 10 ...‘)
>>> for match in iterator:
match.group(),match.span()

4)
sub subn:

re.sub(pattern, repl, string, max=0)
re.sub("g.t","have",‘I get A, I got B, I gut C‘)

re.sub("g.t","have",‘I get A, I got B, I gut C‘,2)
#后面2 数字,是最大替换次数

re.subn("g.t","have",‘I get A, I got B, I gut C‘)
subn不仅全替换了,而且把替换得次数也打印出来。

5)
split:
p = re.compile(r‘\d+‘)
p.split(‘one1two2tree3four4‘)

re.split(‘\d+‘,‘one1two2three3four‘)

6)
re.compile(strPattern[, flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为
Pattern对象。第二个参数flag是匹配模式,取值可以使用按位或运算符‘|‘
表示同时生效,比如re.I | re.M
可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则
表达式编译成正则表达式对象,这样可以提高一定的效率。下面是一个正则表达式对象的一个例子:

import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
regex = re.compile(r‘\w*oo\w*‘)
print regex.findall(text) #查找所有包含‘oo‘的单词

原生字符串 r:

a = re.search(r‘\bblow‘,‘blow‘)

正则分组:
去已经匹配到的数据中再提取数据

时间: 2024-10-28 05:29:48

Python开发【第一篇】Python基础之正则表达式补充的相关文章

Python开发第一篇 基础篇

开发: 操作系统就是个软件 计算机诞生: 计算机硬件的组合 只对操作系统级别的开发工作: 由微软,或者其他开发系统的团队做 开发 语言: 高级语言:Python,  Java ,  PHP,  c#      ,Go      ,ruby     ,C++ ....... 低级语言:C,汇编 区别,高级语言之间,制定的规则不同 机器码和字节码: 机器码:计算机能直接识别的东西(低级语言) 字节码:高级语言通过转换成低级语言能识别的字节码--->机器码(节省转换流程,加速效率) 语言之间的对比:

Python开发第一篇 基础篇(下)

一.python种类 1.1 Cpython python官方版本,使用c语言实现,运行机制:先编译,py(源码文件)->pyc(字节码文件),最终执行时先将字节码转换成机器码,然后交给cpu执行: 如果再次运行时,会优先寻找字节码文件,若源码文件被修改,则会再次编译成字节码 1.2 Jython Python语言的Java实现,不仅提供Python的库,同时也提供所有的Java类.能运行在任何可兼容的Java1.1或更高的Java虚拟机平台上. 运行机制:py(源文件)->动态编译成字节码(

python开发第一篇:目录

初识Python 编程语言介绍 条件语句和基本数据类型 第二章 python基础之函数/递归/内置函数 阅读目录 - [数学定义的函数与Python中的函数](https://www.cnblogs.com/hui147258/p/10810797.html) - 为何使用函数 - 函数和过程 - 函数参数 - 局部变量和全局变量 - 前向引用之‘函数及变量’ - 嵌套函数和作用域 - 递归调用 - 匿名函数 - 函数式编程 - 内置函数 - 练习题 原文地址:https://www.cnblo

图解Python 【第一篇】:Python基础1

本节内容一览图 一.Python简介  Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! 目前Python主要应用领域: 云计算: 云计算最火的语言, 典型应用Ope

python第一篇-------python介绍

python第一篇-------python介绍 一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus.他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言. 最新的TIOBE排行榜,Python赶超PHP占据第4, Py

第一篇-python入门

一 编程与编程语言 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果. 什么是编程语言? #上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人的奴隶,人类

各位大佬Python的第一部分道基础题已经整理好了,希望大家面试的时候能用的上。

Python的第一部分道基础题,希望大家面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之一. 2.通过什么途径学习的Python? 通过自学,包括网上查看一些视频,购买一些相关专业的书籍. 3.Python和Java.PHP.C.C#.C++等其他语言相比? Python:轻量级.易学.自由/开放源码软件.可移植性.支持面向对象.丰富的库.规范的代码. Java:优点:开源性,功能强大,库多 缺点:编译速

windows上Python开发--3.Django的基础知识

最近两天下了班,没事学习了django的开发,今天做个总结.其实大家可以从百度,google搜到一些django的入门视频,初步了解一下django的框架.学习一些基础的概念和知识.本篇主要是对自己这两天做的做个总结. 1.创建第一个views.py 上一篇文章我们在windows上搭建好了django的开发环境并建立一个测试demo. 在settings.py的同级目录下新建views.py目录.并输入以下代码 from django.http import HttpResponse def

visual studio 2015 搭建python开发环境,python入门到精通[三]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo,这里略带一句,其实就"学习python"而言,比较建议使用pycharm,pycharm可以设置VS或者eclipse等多种IDE的编码,可以让绝大部分其他语言使用IDE的习惯者更容易上手.这一点兼容确实做的很好.不过既然这么多园友要求使用vs开发python的话,就介绍一下visual

Windows搭建python开发环境,python入门到精通[一]

从大学开始玩python到现在参加工作,已经有5年了,现在的公司是一家.net的公司用到python的比较少,最近公司有新项目需要用到python,领导希望我来跟其他同事training,就有了这篇博客,打算将python的training弄成一个简易的python系列,供大家入门使用.Python语言自从20世纪90年代初诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.今天就让我们来搭建一个python的开发环境,Windows搭建python开发环境.一切从"Hello world