python中使用正則表達式

1. 匹配字符

正則表達式中的元字符有 .  ^  $ *   +  ?  { }  [ ]  \  | ( )

匹配字符用的模式有

\d 匹配随意数字

\D 匹配随意非数字

\s 匹配随意空白字符

\S 匹配随意非空格字符

\w 匹配随意数字或者字母

\W  匹配随意非数字或者字母

2.  正則表達式

python中使用compile处理正則表達式。如:

import re;

p=re.compile(‘[a-c]’);

p.match(s);

s是待匹配的字符串,match是匹配方法。类似的方法有

match()   确定从行首開始匹配

search()   在任何位置匹配

findall()  找匹配的全部子串,并作为子串返回

finditer()   找匹配的全部子串,而且以迭代器的形式返回

match也有非常多方法。如:

group()   把正則表達式匹配的字符串返回

start()  返回匹配的起点

end()   返回匹配的终点

span()   返回匹配的(start,end)的元组

例1:>>>import re;

>>>p=re.compile(‘^[a-c]’)

>>>q=p.match(“abcd”);

>>>print q.group()

ab

>>>>q.span()

(0,2)

例2:

>>>import re

>>>p=re.compile(‘\d+’);

>>>q=p.findall(‘1 and 10 and 20’);

>>>print q

[‘1’,’2’,’3’]

上述的匹配也能够使用第二种形式。即:

re.match(’\d+’,’d23r’)

例3:

>>>p=re.match(’\d+’,’d23r’)

>>>print p

None

匹配的其他參数:

re.compile(‘[a-c]’,re.I)  re.I 表示忽略大写和小写

re.compile(‘^ab$’,re.M)  re.M 表示^或者$在行首和行尾以及字符串的开头和结束都会进行匹配。

假设不加这个标志。仅仅会在字符串的開始和结束之处匹配

例4:

re.compile(“””

[1-3]       #1-3

[a-c]      # a-c

“””,re.VERBOSE

)              re.VERBOSE  的出现使得正則表達式能够再多行出现,并且能够在每行加上凝视

上面的匹配相当于 re.compile(‘[1-3][a-c]’)

3.  分组

使用()来进行分组

例5:

>>>p=re.compile(‘(12)+’)

>>>m=p.match(‘121212’)

>>>print m.group()

121212

上面匹配的是12反复出现一次或多次

还能够打印分组的信息。

>>>print m.group(1)

12

python会自己主动捕获分组的信息,假设不想捕获分组的信息。能够使用?:

例6:

>>>import re

>>>s =”hello ab1cd”;

>>>p=re.search(‘(?

:h.*)(a.*)(c.*)’);

>>>print “a* {0}”.format(p.group(1))

a*   ab

>>>print “c* {0}”.format(p.group(2))

c*   cd

p.group(0)存放的是整个表达式的匹配情况,p.group(1)存放的是(a.*)的匹配信息,p.group(2)存放的是(b.*)的匹配信息,而 h.*前面由于有?:没有被捕获

假设分组过多。使用组的标号还是显得麻烦,这时能够对组进行命名,然后能够通过名字来使用它们。

例7:

>>>import re;

>>>s=”hello ab1cd”

>>>p=re.search(‘(?P<a>a.*)(?P<c>c.*)’);

>>>print “a*  {0}”.format(p.group(‘a’)

a*   ab

>>>print “c*  {0}”.format(p.group(‘c’))

c*   cd

4.贪婪和非贪婪模式

在贪婪模式下,* + 都会尽可能地多匹配字符。如:

例8:

>>>import re;

>>>p=re.compile('<h.*></h>');

>>>m=p.findall('<h1></h><h2></h>')

>>>print m;

[‘<h1></h><h2></h>’]

有时希望它匹配出<h1></h>,<h2></h>两个结果。这时就能够用非贪婪模式了。仅仅要在*或.后面加上?。

例9:

>>>import re;

>>>p=re.compile('<h.*?

></h>');

>>>m=p.findall('<h1></h><h2></h>')

>>>print m;

[‘<h1></h>’,’<h2></h>’]

5. 前向定界符和后向定界符

假设先匹配模式A,在匹配模式B,能够使用A(?=B),假设先匹配模式A,并且希望后面没有B,能够使用A(?!B).

例10:

>>>import re;

>>>s=”ab2cd”

>>>m=re.search(“ab2(?=cd)”,s);

>>>print m.group();

ab2cd

例11:

>>>import re;

>>>s='ab2cd'

>>>m=re.search('ab2(?!cd)',s);

>>>print m

None

类似地,假设匹配模式B,同一时候在其前面要有模式A,能够使用(?

<=A)B的形式,

假设匹配模式B,同一时候在其前面没有模式A。能够使用(?<!A)B的形式

例12:

>>>import re;

>>>s=”ab2cd”;

>>>m=re.search(‘(?<=ab2)cd’,s)

>>>print m.group()

cd

例13:

>>>import re

>>>string= "ab2cd"

>>>pattern = re.search(r'(?<!ab2)cd',string)

>>>print pattern;

None

python使用正則表達式的更多相关文章

  1. python re 正則表達式

    夜深了.敲击键盘.用CSDN整理下python   re 正則表達式是含有文本和特别字符的字符串,这些文本和特别字符描写叙述的模式能够识别各种字符串. 一下我们从实例结合理论来学习理解吧... 经常使 ...

  2. Python基础--正則表達式基本的语法以及re模块

    正则是个非常牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下python中的re模块. re模块包括对正則表達式的支持. 什么是正则: 正則表達式是能够匹配文本片 ...

  3. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  4. Python正則表達式:怎样使用正則表達式

    正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...

  5. python进阶十_正則表達式(一)

    近期状态一直不太好,至于原因,怎么说呢,不好说,总之就是纠结中覆盖着纠结,心思全然不在点上,希望能够借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想,假设真的是我自己的问题呢,曾经我 ...

  6. 正則表達式re中的贪心算法和非贪心算法 在python中的应用

    之前写了一篇有关正則表達式的文章.主要是介绍了正則表達式中通配符 转义字符 字符集 选择符和子模式 可选项和反复子模式 字符串的開始和结尾 ,有兴趣的能够查看博客内容. 此文章主要内容将要介绍re中的 ...

  7. Python学习笔记8:标准库之正則表達式

    Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...

  8. Python——正則表達式(2)

    本文译自官方文档:Regular Expression HOWTO 參考文章:Python--正則表達式(1) 全文下载 :Python正則表達式基础 ======================== ...

  9. Python正則表達式小结(1)

    学习一段python正則表達式了, 对match.search.findall.finditer等函数作一小结  以下以一段网页为例,用python正則表達式作一个范例: strHtml = '''& ...

随机推荐

  1. SQL In的替换

    前2天在搞SQL的的时候,发现其中有很多in的操作,诸如:id in(1,2,3)或id in(select id from table……),这个对SQL来说并不是最好的选择,执行效率是偏低的[它执 ...

  2. iOS子线程操作UI问题检查

    iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了 ...

  3. Swift - 26 - 函数的基础写法

    //: Playground - noun: a place where people can play import UIKit // 无参无返回 // -> Void可以省略不写, 或者写成 ...

  4. Knockoutjs官网翻译系列(一)

    最近马上要开始一个新项目的研发,作为第一次mvvm应用的尝试,我决定使用knockoutjs框架.作为学习的开始就从官网的Document翻译开始吧,这样会增加印象并加入自己的思考,说是翻译也并不是纯 ...

  5. 通过dbcp链接池对数据库操作报 Cannot create PoolableConnectionFactory (Could not create connection to database server. Attempted reconnect 3 times. Giving up.)--解决方案

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for ...

  6. 【BZOJ1901】Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  7. MySQL存储过程带in和out参数

    MySQL存储过程带in和out参数 最简单的例子: [html] mysql> DELIMITER $$ mysql> USE test $$ Database changed mysq ...

  8. 两个示例介绍JavaScript的闭包

    JavaScript的闭包有两个用途:一个是访问函数内部的变量:另一个是让变量的值在作用域内保持不变.函数是JavaScript 中唯一有作用域的对象,因此JavaScript的闭包依赖于函数实现,下 ...

  9. canvas 渐变

    那么第一种渐变方式就是LinearGradient,具体实施就是以下代码: var colorStyle=context.createLinearGradient(0,0,0,HEIGHT); col ...

  10. python之7-2类的继承与多态

    类的继承的意思就如同父子关系一样,这个儿子继承了父亲的一切,但是在某些地方(属性)相同的时候,儿子的属性大于老子的属性(覆盖),最底层类,总会继承最接近它的那个类的属性init 类的多态总是和继承相连 ...