python中使用正则表达式
正则表达式
元字符:. ^ $ * + ? {} [] \ | ()
第一部分:
1.[]
常用来指定一个字符集,用于匹配其中的一个字符;^,$元字符在里面不起作用,但是+-*等符号在[]中还是有特殊含义的,可以参见split函数使用部分。
>>> r = r'm[abc]n'
>>> re.findall(r,'manddmcnkkkmdn')
['man', 'mcn']
>>> r =r'm[^abc]n'
>>> re.findall(r,'manddmcnkkkmdn')
['mdn']
这里m[^abc]n'表示出了man,mbn,mcn之外的m开头n结尾的三位字符;
2. ^ 在字符串中作为首字母用于匹配行首,'^abc'表示以abc开头的字符串;
>>> r =r'^abc'
>>> re.findall(r,'abdddd')
[]
>>> re.findall(r,'abcccc')
['abc']
>>> re.findall(r,'bcabc')
[]
如果用在字符串的非首字母中不知道什么含义(不确定),如下实践结果:
>>> r =r'a^b'
>>> re.findall(r,'a^b')
[]
>>> re.findall(r,'a')
[]
>>> re.findall(r,'ac')
[]
如果用在[]中开头字母表示非,如上面[^abc]表示非a,非b,非c的其他情况;
如果用在[]非首字母就表示普通的字符,如下:
>>> r = r't[a^]'
>>> re.findall(r,'ta')
['ta']
>>> re.findall(r,'t^')
['t^']
3. $ 字符串末尾用于匹配行尾,'abc$'表示以abc结尾的字符串,但是在如果$用在了[]中就表示普通的字符:
>>> r = r'a[b$]'
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'a$')
['a$']
>>> r = r'ab$'
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abb')
[]
>>> re.findall(r,'cab')
['ab']
>>> re.findall(r,'ab$')
[]
第二部分:
1. 把一个元字符转换成普通的字符时候可以用反斜杠"\";
例如:"^ab"表示以ab开头的字符串;"\^ab"表示字符串"^ab",这里的^就是普通字符无特殊含义;
>>> import re
>>> r =r"^ab"
>>> re.findall(r,"abc")
['ab']
>>> re.findall(r,"bcd")
[]
>>> r=r"\^ab"
>>> re.findall(r,"^abcd ab")
['^ab']
>>>
2. 反斜杠除了用于取消元字符的意义外,反斜杠后面还可以添加不同的字符以表示不同的特殊意义:
\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_]
3. *表示它前面一个字符出现0到多次,例如下面b字符没有出现也能匹配到;
>>> r = r'ab*'
>>> re.findall(r,'a')
['a']
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abb')
['abb']
>>> re.findall(r,'abbbbbb')
['abbbbbb']
4. + 表示它前面的字符至少出现一次,例如下面b字符没有出现时候匹配不到;
>>> r =r'ab+'
>>> re.findall(r,'a')
[]
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbb')
['abbb']
5. ? 表示它前面的字符出现一次或者0次,一般用于连接可有可无的符号。例如电话号码中”-“出现可以不出现也可以就可以用"-?"来表示;
6. 贪婪模式(最大匹配)
>>> r = r'ab+'
>>> re.findall(r,'abbbbbbbb')
['abbbbbbbb']
7. 非贪婪模式(最小匹配)
>>> r = r'ab+?'
>>> re.findall(r,'abbbbbbbbb')
['ab']
8.{m} 前面一个字符m次
{m,n} 表示前面一个字符至少出现m次,最多出现n次,如'a{1,3}'表示a字符出现1到3次;
例如:
>>> r = r'a{1,3}'
>>> re.findall(r,'a')
['a']
>>> re.findall(r,'b')
[]
>>> re.findall(r,'aaa')
['aaa']
>>> re.findall(r,'aaaa')
['aaa', 'a']
9 {0,}等同于*
{1,}等同于+
{0,1}等同于?
正则表达式常用函数:
1. 编译正则表达式以提高执行效率re.compile(表达式,匹配字符,[标记位])
>>> r = r'\d{3,4}-?\d{8}'
>>> tel = re.compile(r)
>>> tel.findall('025-88886400')
['025-88886400']
>>> re.findall(tel,'025-88886400')
['025-88886400']
>>>
>>> r = r'abc'
>>> s = re.compile(r)
>>> s.findall('Abc')
[]
>>> s =re.compile(r,re.I)
>>> s.findall('Abc')
['Abc']
>>> re.findall(s,'Abc')
['Abc']
>>>
注意:定义正则表达式加r跟不加r有什么区别?
2. match,开头匹配上才能匹配返回
>>> s =re.compile(r,re.I)
>>> s.findall('Abc')
['Abc']
>>> re.findall(s,'Abc')
['Abc']
>>>
3. search,不管什么位置匹配上都返回
>>> re.search(r,'abc hi')
<_sre.SRE_Match object at 0x00BFF800>
>>> re.search(r,'hi abc')
<_sre.SRE_Match object at 0x00BFF870>
>>>
注: match跟search如果没有匹配到的话,返回None,如果成功匹配则返回一个'MatchObject'实例,如上。
查看MatchObject的数据方法:
group返回被匹配的字串;
start返回匹配开始的位置;
end返回匹配结束的位置;
span返回一个元组,包含匹配开始,结束的位置。
>>> r = r'abc'
>>> re.search(r,'hi abc hi abc no abc')
<_sre.SRE_Match object at 0x00BFF838>
>>> x = re.search(r,'hi abc hi abc no abc')
>>> print(x)
<_sre.SRE_Match object at 0x00BFF800>
>>> x.group()
'abc'
>>> x.group(0)
'abc'
>>> x.group(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
>>> x.start()
3
>>> x.end()
6
>>> x.span()
(3, 6)
4. findall 找到满足规则的所有字符串,作为一个列表返回;
5. finditer 找到满足规则的所有字符串,作为一个迭代器返回;
6. sub 根据正则表达式做字符串替换
>>> r = r'a..t'
>>> re.sub(r,'hi','abttt acvt')
'hit hi'
>>> re.subn(r,'hi','abttt acvt')
('hit hi', 2)
7. subn 返回结果中多了一个值,替换了多少次。
8. split 对字符串进行切割,[]中使用+*等元字符时候需要用反斜杠。
>>> s = '124+235-566*888'
>>> re.split(r'[\-\+\*]',s)
['124', '235', '566', '888']
正则表达式内置属性:
1. 编译标志位
I表示不区分大小写;
S表示匹配换行在内的所有字符,例如:
>>> r = r'abc.zdr'
>>> re.findall(r,'abcczdr')
['abcczdr']
>>> re.findall(r,'abc.zdr')
['abc.zdr']
>>> re.findall(r,'abc\nzdr')
[]
>>> re.findall(r,'abc\nzdr',re.S)
['abc\nzdr']
M表示多行匹配,一般用于从文件中读取数据,例如:
>>> s = """
... hi yahoo
... yahoo hi
... hi sina
... sina hi
... """
>>> r = r'^hi'
>>> re.findall(r,s)
[]
>>> s
'\nhi yahoo\nyahoo hi\nhi sina\nsina hi\n'
>>> re.findall(r,s,re.M)
['hi', 'hi']
X表示定义的正则表达式包含多行的时候,如果使用它就需要加上X属性,例如:
>>> tel =r"""
... \d{3,4}
... -?
... \d{8}
... """
>>> tel
'\n\\d{3,4}\n-?\n\\d{8}\n'
>>> re.findall(tel,'025-12345678')
[]
>>> re.findall(tel,'025-12345678',re.M)
[]
>>> re.findall(tel,'025-12345678',re.X)
['025-12345678']
正则表达式中分组:(|),当有分组的时候,匹配查询的结果只有分组的字符,利用这个特性一般会有很多用途;
>>> email = r'\w{3,6}@\w+(\.com|\.cn)'
>>> re.match(email,'ggg@aaa.com')
<_sre.SRE_Match object at 0x00C575A0>
>>> re.match(email,'ggg@aaa.cn')
<_sre.SRE_Match object at 0x00C57560>
>>> re.match(email,'ggg@aaa.org')
>>>
>>> re.findall(email,'ggg@aaa.com')
['.com']
python中使用正则表达式的更多相关文章
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...
- python模块 re模块与python中运用正则表达式的特点 模块知识详解
1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...
- Python学习-38.Python中的正则表达式(二)
在Python中,正则表达式还有较其他编程语言有特色的地方.那就是支持松散正则表达式了. 在某些情况,正则表达式会写得十分的长,这时候,维护就成问题了.而松散正则表达式就是解决这一问题的办法. 用上一 ...
- Python学习-37.Python中的正则表达式
作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...
- [Python]网络爬虫(七):Python中的正则表达式教程
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8929576#t4 接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一 ...
- [Python]网络爬虫(七):Python中的正则表达式教程(转)
接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. ...
- 在python中使用正则表达式(转载)
https://www.cnblogs.com/hanmk/p/9143514.html 在python中使用正则表达式(一) 在python中通过内置的re库来使用正则表达式,它提供了所有正则表 ...
- python中的正则表达式(re模块)
一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- python中关于正则表达式三
2015年8月14日 11:10 7.2正则表达式操作 正则表达式使用反斜杠字符'\'来暗示一些特殊的形式或者允许特殊的字符使用但是没有调用它们特殊的意思.在字符串常量中的相同目标的字符的python ...
随机推荐
- B窗体继承于A窗体,B启动:问题点
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; t ...
- Tornado学习笔记12 tornado.httpserver-.非阻塞的Http服务器
是一个非阻塞的,单线程的Http 服务器. 一般地,应用程序很少与HttpServer类直接交互,除非在进程开始时启动服务时(甚至在使用tornado.web.Applicaiton.listen时也 ...
- 解决使用osgModeling的Loft生成管子时的bug
最近在使用osgModeling的Loft生成管子的时候, 发现这个类还是有点bug的. 具体的表现就是在某些情况下, 生成管子的某些节点会是扁的, 而且有时管子会莫名的变粗. 在网上各种求助无果 ...
- 在freemarker中,价格 怎么将¥100变成 ¥100.00
${tempNum?string.currency}或${tempNum?string(“currency”)} à结果为¥20.00${tempNum?string. percent}或${temp ...
- C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现
C# 默认是不能修改已装箱了的值类型中字段的值,但是可以通过 值类型实现指定的接口来改变 首先定义一个接口 interface IChange { void Change(int a, int b); ...
- 使用BBED模拟Oracle数据库坏块
BBED(OracleBlockBrowerandEDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢 ...
- Spring 异常:Error creating bean with name
异常信息:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx' 我今 ...
- 基于Jquery的页面过渡效果(原创)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket
这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台使用说明
PDF下载地址:http://pan.baidu.com/s/1c2ca2lU