正则表达式
元字符:. ^ $ * + ? {} [] \ | ()
第一部分:
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相关软件库的安装

    1 安装python 2 安装sublime text2 3 安装NumPy.Matplotlib http://book.51cto.com/art/201401/426522.htm Matplo ...

  2. 用C#通过正则表达式截取字符串中符合条件的子字符串

    仅仅作为简单的记录,不多说直接上代码(仅测试使用): private void Test() { Regex ConnoteA = new Regex("^[a-zA-Z]\\d{8}$&q ...

  3. java 猜数字游戏

    作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...

  4. Oracle协议适配器错误解决办法

    在Oracle中新建了一个数据库,今天把它删了之后再登录SQL*PLUS就登不上去了,出现ORA-12560:TNS:协议适配器错误. ORA-12560: TNS: 协议适配器错误的解决方法 造成O ...

  5. android解析json

    android2.3提供的json解析类 android的json解析部分都在包org.json下,主要有以下几个类: JSONObject:可以看作是一个json对象 JSONStringer:js ...

  6. requirejs(一)

    RequireJs已经流行很久了,我们在项目中也打算使用它.它提供了以下功能: 声明不同js文件之间的依赖 可以按需.并行.延时载入js库 可以让我们的代码以模块化的方式组织 初看起来并不复杂. 在h ...

  7. js模块开发(一)

    现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...

  8. ios 实现自定义状态栏StatusBar 和 导航栏navigationBar 的状态和颜色

    很多app中可以看到不同与导航栏的状态栏的颜色,他妈的真绕嘴. 一.更改状态栏颜色 (StatusBar) 就是比如导航栏是红色的状态栏是绿色的. 要实现这样的效果其实很简单,就是添加一个背景view ...

  9. 使用JQuery UI selectmenu, onchange事件失效

    今天, 在用jQuery UI的一套东西是发现<select class="dropmenu" onchange="do();"></sele ...

  10. Win 10 文件浏览器无法打开

    今天遇到个很奇怪的问题,文件浏览器File Explorer无法正常显示,点击打开后任务栏上已经显示打开了,但是屏幕上却看不到任何窗口,开始以为机子中了恶意的木马,然后就疯狂的查毒,然而并没有解决问题 ...