正则表达式
元字符:. ^ $ * + ? {} [] \ | ()
第一部分:
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中使用正则表达式的更多相关文章

  1. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

  2. 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类

    在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...

  3. python模块 re模块与python中运用正则表达式的特点 模块知识详解

    1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...

  4. Python学习-38.Python中的正则表达式(二)

    在Python中,正则表达式还有较其他编程语言有特色的地方.那就是支持松散正则表达式了. 在某些情况,正则表达式会写得十分的长,这时候,维护就成问题了.而松散正则表达式就是解决这一问题的办法. 用上一 ...

  5. Python学习-37.Python中的正则表达式

    作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...

  6. [Python]网络爬虫(七):Python中的正则表达式教程

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8929576#t4 接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一 ...

  7. [Python]网络爬虫(七):Python中的正则表达式教程(转)

    接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. ...

  8. 在python中使用正则表达式(转载)

    https://www.cnblogs.com/hanmk/p/9143514.html 在python中使用正则表达式(一)   在python中通过内置的re库来使用正则表达式,它提供了所有正则表 ...

  9. python中的正则表达式(re模块)

    一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...

  10. python中关于正则表达式三

    2015年8月14日 11:10 7.2正则表达式操作 正则表达式使用反斜杠字符'\'来暗示一些特殊的形式或者允许特殊的字符使用但是没有调用它们特殊的意思.在字符串常量中的相同目标的字符的python ...

随机推荐

  1. Python学习笔记(一)——环境搭建

    一.安装包下载: 国内镜像:32位:http://pan.baidu.com/s/1jI4q4lS        64位:http://pan.baidu.com/s/1eRPhpRW 版本更迭速度很 ...

  2. Quick Apps for Sharepoint小型BI解决方案

    Quick Apps for Sharepoint介绍 Quick Apps for Sharepoint前身是Quest Webpart ,由企业软件开发商QuestSoftware开发,Quest ...

  3. 如何保存微信的小视频 How to keep WeChat 'Sights'

    微信小视频非常方便,但很难将其下载到本地电脑长期保存.网上有介绍方法,如百度经验上办法,但目前看来它可能只适用安卓系统,而且或已失效(可能由于版本更新).对Windows Phone无效,而对于更加封 ...

  4. Dijkstra算法初步 - 迷宫问题

    你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了 ...

  5. Linux下面桌面的安装

    挂载光盘后配置yum文件,配置后 使用yum grouplist 命令 查看组 用yum install '"GNOM桌面组 输入 init 5   即可进入桌面模式 0 关机  3命令行级 ...

  6. About_Web

    成功网站的三要诀:内容.设计.营销 内容为王: 高质量的内容会促使网站走向成功.首先,用户有需求,他们需要被感动,被娱乐,被有料的内容和产品所吸引.漂亮的背景和亮骚的特效可能会有所助益,但终究只是辅助 ...

  7. vim 长句子中的上下移动

    当一个句子很长的时候,屏幕显示不下,就会分为多行,这个时候,你又想找到中间几行某部分的字母,怎么办?这个时候,先按下一个 g ,在按下 j / k ,就可以实现长句子的上下移动了.

  8. jquery实现限制textarea输入字数

    ie中可用onpropertychange监听改变事件 火狐和谷歌可用oninput监听改变事件 综合: //使系统中class='text-length'的输入框只能输入200字符(主要用于text ...

  9. Heartbeat+DRBD+MySQL高可用方案

    1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自 ...

  10. 页面引入flash

    function shFlashObj(id, data, oWidth, oHeight, flashvals,beFullScreen) {    var swf='<object id=& ...