Python正则表达式指南这篇文章很好,推荐阅读。

本文则是简单记录下我自己学习Re的笔记, 环境是python3.5。

### 1.简单的Re语法
* `^` 匹配字符串开始位置。
* `$` 匹配字符串结束位置。
* `\b` 匹配一个单词边界。
* `\d` 匹配一个数字。
* `\D` 匹配一个任意的非数字字符。
* `x?` 匹配可选的 x 字符。换句话说,就是 0 个或者 1 个 x 字符。但是?还有第二个含义,作为正则的懒惰模式。
* `x*` 匹配 0 个或更多的 x。
* `x+` 匹配 1 个或者更多 x。
* `x{n,m}` 匹配 n 到 m 个 x,至少 n 个,不能超过 m 个。
* `x{n}`匹配n个x,一定是n个
* `(a|b|c)` 匹配单独的任意一个 a 或者 b 或者 c。
* `(x)` 这是一个组,它会记忆它匹配到的字符串。
* `\w` 一个字母或数字
* `.` 任意字符
* `\s` 空格
* `[]` 表示范围,[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线。
* `[^]` 作为方括号中的第一个字符, `^`有特别的含义:非。 `[^abc]` 的意思是: “ 除了 a、 b 或 c之外的任何字符”。
```
>>> re.search('[^aeiou]y$', 'vacancy')

>>> re.search('[^aeiou]y$', 'boy')
>>>
```

2.自然字符串

如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicatedby \n"。

一定要用自然字符串处理正则表达式。否则会需要使用很多的反斜杠。例如,后向引用符可以写成'\1'或r'\1'。

强烈建议使用 Python 的 r 前缀,就不用考虑转义的问题了

### 3.re.search(pattern, string, flags=0) 和 re.match(pattern, string, flags=0)
`search()`的帮助信息:`Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.`。`match()`的帮助信息:`Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.`。

re 模块最基本的方法是 search()函数(类似于match()函数)。它使用正则表达式来匹配字符串( M)。如果成功匹配, search()返回一个匹配对象。

>>> pattern = '^M?M?M?$'
>>> re.search(pattern, 'M')
<_sre.SRE_Match object; span=(0, 1), match='M'>

match()函数同样的功能。

>>> pattern = '^M?M?M?$'
>>> re.match(pattern, 'M')
<_sre.SRE_Match object; span=(0, 1), match='M'>

re.match()只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search()匹配整个字符串,直到找到一个匹配。

#!/usr/bin/python
import re
line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print("match --> matchObj.group() : ", matchObj.group())
else:
print("No match!!") matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print("search --> matchObj.group() : ", matchObj.group())
else:
print("No match!!") # No match!!
# search --> matchObj.group() : dogs
# [Finished in 0.1s]

### 4.re.compile(pattern, flags=0)
`Compile a regular expression pattern, returning a pattern object.`
Re模块的`compile()`方法编译正则表达式,返回一个pattern对象。
编译后生成的 pattern 对象,已经包含了正则表达式(regular expression),所以调用对应的方法时不用给出正则表达式了。
用编译后的pattern对象去匹配字符串`patternobj.search(string)`,如果匹配成功,返回的结果调用`groups()`方法,可以得到这个正则表达式中定义的所有分组结果组成的元组。
但如果`search()`方法匹配不成功,返回`None`,它没有 `groups()`方法,所以调用 None.groups()将会抛出一个异常。
```
>>> phonePattern = re.compile(r'^(\d{3})-(\d{3})-(\d{4})$')

dir(phonePattern)

['class', 'copy', 'deepcopy', 'delattr', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'le', 'lt', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn']

phonePattern

re.compile('^(\d{3})-(\d{3})-(\d{4})$')

m = phonePattern.search('800-555-1212')

m

<_sre.SRE_Match object; span=(0, 12), match='800-555-1212'>

m.groups()

('800', '555', '1212')

匹配失败

phonePattern.search('800-555-1212-1234').groups()

Traceback (most recent call last):

File "<pyshell#24>", line 1, in

phonePattern.search('800-555-1212-1234').groups()

AttributeError: 'NoneType' object has no attribute 'groups'

<br/>
### 5. re.sub(pattern, repl, string, count=0, flags=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.
正则表达式模块的`re.sub()`函数可以做字符串替换,如下它在字符串 s 中用正则表达式‘ROAD$’来搜索并替换成‘RD.’。

s = '100 NORTH BROAD ROAD'

import re

re.sub('ROAD$', 'RD.', s)

'100 NORTH BROAD RD.'

re.sub('[abc]', 'o', 'caps')

'oops'

可能会认为该函数会将 caps 转换为 oaps,但实际上并不是这样。`re.sub()` 替换所有的匹配项,而不仅仅是第一个匹配项。因此该正则表达式将 caps 转换为 oops,因为无论是 c 还是 a 均被转换为 o 。
在替换字符串中,用到了新的语法: \1,它表示“嘿,记住的第一个分组呢?把它放到这里。 ”在此例中, 记住了 y 之前的 c ,在进行替换时,将用 c 替代 c,用 ies 替代 y 。(如果有超过一个的记忆分组,可以使用 \2 和 \3 等等。)

re.sub('([^aeiou])y$', r'\1ies', 'vacancy')

'vacancies'

<br/>
### 6. re.findall(pattern, string, flags=0)
Return a list of all non-overlapping matches in the string.

If one or more capturing groups are present in the pattern, return
a list of groups; this will be a list of tuples if the pattern
has more than one group. Empty matches are included in the result.
`re.findall()`接受一个正则表达式和一个字符串作为参数,然后找出字符串中出现该模式的所有地方。在这个例子里,模式匹配的是数字序列。`findall()`函数返回所有匹配该模式的子字符串的列表。

re.findall('[0-9]+', '16 2-by-4s in rows of 8')

['16', '2', '4', '8']

这里正则表达式匹配的是字母序列。再一次,返回值是一个列表,其中的每一个元素是匹配该正则表达式的字符串。

re.findall('[A-Z]+', 'SEND + MORE == MONEY')

['SEND', 'MORE', 'MONEY']

**懒惰模式和贪婪模式**
`.*`具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。
`.*?`则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
`?`的一个用法是匹配0次或1次。但是`?`还有第二个含义,作为正则的懒惰模式。后边多一个`?`表示懒惰模式,必须跟在`*`或者`+`后边用。
re 正则有两种模式,一种为贪婪模式(默认),另外一种为懒惰模式,以下为例:
`(abc)dfe(gh)`
对上面这个字符串使用`(.*)`将会匹配整个字符串,因为正则默认是尽可能多的匹配。
虽然`(abc)`满足我们的表达式,但是`(abc)dfe(gh)`也同样满足,所以正则会匹配多的那个。
如果我们只想匹配`(abc)`和`(gh)`就需要用到以下的表达式`(.*?)` 惰性模式匹配示例:

re.findall(' s.*? s', "The sixth sick sheikh's sixth sheep's sick.")

[' sixth s', " sheikh's s", " sheep's s"]

re.findall(' s.* s', "The sixth sick sheikh's sixth sheep's sick.")

[" sixth sick sheikh's sixth sheep's s"]

加上分组:

re.findall(' s(.*?) s', "The sixth sick sheikh's sixth sheep's sick.")

['ixth', "heikh's", "heep's"]

python 正则表达式Re的更多相关文章

  1. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  2. Python正则表达式中的re.S

    title: Python正则表达式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正则表达式,python] --- 在Py ...

  3. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  4. python正则表达式re

    Python正则表达式: re 正则表达式的元字符有. ^ $ * ? { [ ] | ( ).表示任意字符[]用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可 ...

  5. Python正则表达式详解

    我用双手成就你的梦想 python正则表达式 ^ 匹配开始 $ 匹配行尾 . 匹配出换行符以外的任何单个字符,使用-m选项允许其匹配换行符也是如此 [...] 匹配括号内任何当个字符(也有或的意思) ...

  6. 比较详细Python正则表达式操作指南(re使用)

    比较详细Python正则表达式操作指南(re使用) Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 E ...

  7. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  8. python正则表达式 小例几则

    会用到的语法 正则字符 释义 举例 + 前面元素至少出现一次 ab+:ab.abbbb 等 * 前面元素出现0次或多次 ab*:a.ab.abb 等 ? 匹配前面的一次或0次 Ab?: A.Ab 等 ...

  9. Python 正则表达式-OK

    Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...

  10. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

随机推荐

  1. 网站论坛同步用户,整合api,实现…

    在网上参考了很多资料后,终于完美实现了网站和discuz!nt论坛的双向整合,整合后网站和论坛之间可以同步注册.登录.退出和修改登录密码操作. 本系统的实现形式是新云CMS网站(ASP)和Discuz ...

  2. Smarty学习笔记(二)

    1.引用 {include file="xxx.xxx" sitename="xxx"} 向引入的文件传入变量: {include file="xxx ...

  3. Unity3D学习笔记(五)C#与JavaScript组件访问的比较

    由于之前用JavaScript用的比较多,因此总是想用以前的方法来访问组件,却屡遭失败,经过查阅资料发现,二者存在较大的不同. 下面以调用3D Text组件HurtValue为例,来比较二者的不同 J ...

  4. C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  5. linux设置系统时间

    设置系统时间 -         date命令:显示系统的时间,可以在直接输入"date"命令来查看系统的时间 -           date+%y/%m/%d -        ...

  6. ARM linux常用汇编语法

    汇编语言每行的语法:     lable: instruction  ; comment 段操作: .section           格式: .section 段名 [标志]     [标志]可以 ...

  7. web报表工具FineReport的JS编辑框和URL地址栏语法简介

    JS编辑框: 1.FineReport的js. 作为一款BS产品,browser端的JavaScript是必不可少的. FineReport中的js是已经调用了finereport.js的. 大家知道 ...

  8. Linux内核中断和异常分析(中)

    在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...

  9. javascript、ruby和C性能一瞥(3) :上汇编

    在博文(1)和(2)里分别用了4中方式写一个素数筛选的算法,分别是javascript in browser.node.js.ruby和c:最终的结果是c最快,node.js其次,js in b虽然也 ...

  10. nodejs--(一)http模板篇

    Nodejs http模块可以创建服务器应用实例,也能发送http请求 1.http.get(options[, callback]) 发送简单Get请求,并响应 var http=require(' ...