python中的re模块和正则表达式基础
1.正则匹配基础知识
(1)通配符.
.只匹配一个字符
>>> re.findall("p.ckname","piiickname-pockname")
['pockname']
如果要匹配.等特殊字符,要使用注意字符\
>>> re.findall("p.ckname","pickname--p.ckname")
['pickname', 'p.ckname']
>>> re.findall("p\.ckname","pickname--p.ckname")
['p.ckname']
(2)字符集[],只能匹配单个字符,匹配多个见(4)
[a-z] 可以匹配a-z之间任意一个字符
[a-zA-Z0-9]匹配a-z,A-Z,0-9的任意一个字符
[^p]反转匹配,可以匹配除了p的一个字符串,注意是使用[ ]括起来的,和(5)区分出来
#例子
>>> re.findall("p[a-z]ckname","piickname-pockname")
['pockname']
>>> re.findall("p[a-z]*ckname","piickname-pockname")
['piickname', 'pockname']
>>> re.findall("p[^o]ckname","pickname-pockname")
['pickname'] @反转匹配
(3)选择符 | 相当于或
>>> re.findall("name|test","pickname-testpy")
['name', 'test']
(4)可选项,注意()的使用
()?子模式出现0次或者1次
()*子模式出现0次或者多次
()+子模式出现1次或者多次
(){m,n}子模式出现m-n次
在这个模式下注意一下findall和search的结果
>>> aa=re.search("(name){2}","myname--mynamename--my")
>>> print aa.group()
namename >>> re.findall("my(name){2}","myname--mynamename--my")
['name'] 这里匹配不到namename,需要进一步理解re的几个函数区别
举个例子r'(http://)?(www\.)?baidu\.com'
匹配结果:http://www.baidu.com
http://baidu.com
www.baidu.com
baidu.com
(5)开头和结尾
^只想在字符串的开头匹配http ^http
$只想在字符串的结尾匹配http http$
这里要区分下不以http开头的string怎么写呢?
[^http]要写在[ ]里面
2.re模块
re.compile()
可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。
text="hello,meixiaoer!"
pa=re.compile('h')
pa.match(text)
pa.findall(text)
pa.search(text)
结果:<_sre.SRE_Match object at 0x01ADF100>
['h']
<_sre.SRE_Match object at 0x01A6EDE8>
re.match()
尝试从字符串的开始匹配一个模式,只匹配一个!
re.match('h',text) 结果是<_sre.SRE_Match object at 0x01ADF090>
re.match('e',text) 结果是none
要是想打印出匹配字符可以这样
m=re.match('h',text)
print m.group(0) 结果是h
re.search() 只匹配一个!
函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回,未匹配返回none
>>> re.search('e',text)
<_sre.SRE_Match object at 0x01ADF100>
打印元素
>>> m=re.search('e',text)
>>> print m.group(0)
e
因为只匹配第一个元素,所以第二个元素会报错
>>> m=re.search('e',text)
>>> print m.group()
IndexError: no such group
re.findall()查找多有符合的元素,匹配所有,返回列表
>>> re.findall("name","name-myname-yourname")
['name', 'name', 'name']
>>> re.findall("^name","name-myname-yourname")
['name'] 因为^name正则表达式是从开始匹配的,可以理解下
另一个例子更清楚的看清三个函数的区别
#只有findall可以查找所有的
f=re.findall('[0-9]','2fff4')
print f #['2','4'] 返回结果是列表
s=re.serach('[0-9]','fff45')//查找第一个符合的以后就停止查找了
print s.group() #
m=re.match('[0-9]','fff45') //从第一个字符开始匹配,符合以后就停止查询
print m.group() #None
m=re.match('[0-9]','1fff45')
print m.group() #
###########一些常用的使用场景#################
1.
#使用()进行分组
#不使用(),表示表达式是一个组,就要使用group(0)
m=re.match(r'\d{3}-\d{3,8}','010-12345')
print m.group(0) #010-12345,ps特殊符号一遍要使用\-但是-这里不使用也可以
#如果使用(),表示表达式是有n个组的,所以要使用groups()
m=re.match(r'(\d{3})-(\d{3,8})','010-12345')
print m.groups()#('010', '12345')
print m.group(0)#010-12345 默认组0,组0包含整个字符串
print m.group(1)#010 组1包含第一个()内的正则
print m.group(2)#123456 组2包含第二个()内的正则
2. 分割字符应用
p=re.compile(r'd+')
p.split('one1two22three333four') #['one', 'two', 'three', 'four']
两种方法,先compile后,就不用每次都运行compile了
ss="hello,what,is,,,,,,your,,name"
import re
sss=re.split('[,]+',ss)
print sss #等同于
pa=re.compile('[,]+')
aaa=pa.split(ss)
print aaa
3替换应用,最突出的就是和组结合使用
re.sub()
4贪婪匹配
将贪婪比配转换成非贪婪模式?,这里注意?的位置啊
ss='*mili*is*great*'
#贪婪模式
pa=re.compile(r'\*(.+)\*')
print pa.match(ss).group(0)
#*mili*is*great* 世界只想匹配*mili*,贪婪尽可能多的东西匹配 #非贪婪模式,匹配到就停止
pa1=re.compile(r'\*(.+?)\*') #这里注意下?的位置啊(.+)?这个?指的是0次或者1次,不一样的
print pa1.match(ss).group(0)
#*mili*
5 re.sub替换,模式替换
#替换re.sub强大之处就在于替换中使用组号,默认整个字符创是group(0),\1第一个()group(1)
#re.sub(pa,repl,string,count=0) 用repl替换pa匹配的地方
print help(re.sub)
ss='hello, *world*'
pa=re.compile(r'\*([^\*]+)\*') #匹配不以*开头的字符串,^需要[^]使用
print re.sub(pa,'hahahaha',ss)
#hello, hahahaha pa1=re.compile(r'\*([^\*]+)\*')
print re.sub(pa,r'<h1>\1</h1>',ss)
#\1第一个()group(1)
hello, <h1>world</h1>
python中的re模块和正则表达式基础的更多相关文章
- python 中的re模块,正则表达式
一.re模块 re模块中常用的方法. match: 默认从字符串开头开始匹配,re.match('fun', 'funny') 可以匹配出来 'fun' match(pattern, string, ...
- Python中的re模块--正则表达式
Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...
- 常用正则表达式与python中的re模块
正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...
- Python中的random模块,来自于Capricorn的实验室
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- Python中的logging模块
http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...
- Python中的random模块
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- 浅析Python中的struct模块
最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...
- python中的StringIO模块
python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...
- python中的select模块
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...
随机推荐
- Java:数组
数组 数组是一种引用数据类型(所以才会看到 new int[]),数组的长度初始化完成后是固定的.在内存中初始化数组后的空间就固定下来,即便数组中的内容被清空了,但在内存中占有的空间保留了下来,依然是 ...
- Asynchttpclient开源框架下载图片和文本,于Volley和Glide开源框架的区别。
AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-httpAsyncH ...
- POJ 2255 Tree Recovery 树的遍历,分治 难度:0
http://poj.org/problem?id=2255 #include<cstdio> #include <cstring> using namespace std; ...
- UVa 10870 - Recurrences
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- FOJ 2105 Digits Count
题意:对一串数字进行抑或某数,和某数,或某数,统计某区间和的操作. 思路:因为化成二进制就4位可以建4颗线段树,每颗代表一位二进制. and 如果该为是1 直接无视,是0则成段赋值为0: or 如 ...
- 佳佳的魔杖 (vijos 1283)
题目大意: 一根树枝有N段,每一段有一个分数,可以选取一些不完全包含(可以相交)的区间,每次选取可以得到区间里所有数之和的分数. 求最大得分. 解题过程: 1.很明显的dp,默认选取区间的顺序是从左往 ...
- 在线体验K2 BPM微信审批
“微信审批”在江湖中传言已久,但很多人依然“只闻其声,未见其人”,这传说中的手感到底有多好?今天,我们就一起来揭开它的真面目吧. 故事发生在上周六傍晚,我接到了加班电话. 晚上21:30终于加完班了, ...
- 企业需要k2来解放孤岛危机
当我谈孤岛危机时,我谈些什么?你以为我要说的是一款风靡的游戏?那恐怕要让你失望了,今天要谈的是“企业管理体系孤岛”,但更多人甚至都没意识到这是危机. 下面的场景,也许你会觉得似曾相识. 场景一 某制鞋 ...
- Sketchup+ArcGIS三维建模与管理
一.软件安装及其说明 1.需要安装的软件及其安装: 这份报告主要涉及到的有三个需要安装的软件ArcGIS9.3(或9.2) .Sketchup6.0和SketchUp6 ESRI 插件. ArcGIS ...
- 关于BIOS的一点东西
关于BIOS的一点东西 编辑删除转载2016-05-20 00:36:36 去把BIOS的每个单词意思都有道一遍就都明白了,BOOT是更改 启动顺序的(台式机一直按del键就会进入BIOS界面,用上下 ...