python正则表达式--基本用法和函数(简单实例)

来源:互联网 发布:网络通信工程师笔试 编辑:程序博客网 时间:2024/04/28 02:54

首先引入re模块

#coding:utf-8import re

引入文本,可以是文件

string1='''The day broke gray and dull. The clouds hung heavily, and the doctor shook his head.'''

比较match和search

s1=re.search('The',string1)print s1s2=re.search('The',string1)print s2s3=re.search('day',string1)print s3s4=re.match('day',string1)print s4

输出

<_sre.SRE_Match object at 0x012E7D40><_sre.SRE_Match object at 0x012E7BF0><_sre.SRE_Match object at 0x01973B48>None

其他方法类似,一看就懂。
边界符号
和search()一起使用,确定范围。

#边界符号re.search(r'^The',string1)#The开始re.search(r'The$',string1)#The结束re.search(r'^The$',string1)#只匹配There.search(r'\bthe',string1)#The开始re.search(r'\bthe\b',string1)#只匹配There.search(r'\Bthe',string1)#非The开始的字符串

子组
使用()的表达式,会额外放置到一个group里面;
group()获取子组,groups()返回所有子组。

#没有子组print '------------没有子组----------------'m=re.match('ab','ab')print m.group(0)#group()=group(0)print m.groups()print '------------一个子组----------------'#一个子组m=re.match('(ab)','ab')print m.group(0)#group()=group(0)print m.group(1)print m.groups()print '-------------两个子组----------------'m=re.match('(a)(b)','ab')print m.group(0)#group()=group(0) #输出完全匹配结果print m.group(1)#子组一匹配结果print m.group(2)#子组二匹配结果print m.groups()print '-------------子组嵌套----------------'m=re.match('(a(b))','ab')print m.group(0)#group()=group(0) #输出完全匹配结果print m.group(1)#子组一匹配结果 相当于(ab)print m.group(2)#子组二匹配结果print m.groups()#所有子组

输出:

------------没有子组----------------ab()------------一个子组----------------abab('ab',)-------------两个子组----------------abab('a', 'b')-------------子组嵌套----------------ababb('ab', 'b')Process finished with exit code 0

扩展符号(?…)
这是一个表达式的扩展符号。’?’后的第一个字母决定了整个表达式的语法和含义,除了(?P…)以外,表达式不会产生一个新的组。下面介绍几个目前已被支持的扩展:
(?iLmsux)
‘i’、’L’、’m’、’s’、’u’、’x’里的一个或多个字母。表达式不匹配任何字符,但是指定相应的标志:re.I(忽略大小写)、re.L(依赖locale)、re.M(多行模式)、re.S(.匹配所有字符)、re.U(依赖Unicode)、re.X(详细模式)。关于各个模式的区别,下面会有专门的一节来介绍的。使用这个语法可以代替在re.compile()的时候或者调用的时候指定flag参数。
例如,上面举过的例子,可以改写成这样(和指定了re.MULTILINE是一样的效果):
复制代码 代码如下:

>>> re.findall('(?m)(foo.$)', 'foo1\nfoo2\n')['foo1', 'foo2']

另外,还要注意(?x)标志如果有的话,要放在最前面。
(?:…)
匹配内部的RE所匹配的内容,但是不建立组。

(?P…)
和普通的圆括号类似,但是子串匹配到的内容将可以用命名的name参数来提取。组的name必须是有效的python标识符,而且在本表达式内不重名。命名了的组和普通组一样,也用数字来提取,也就是说名字只是个额外的属性。
演示一下:
复制代码 代码如下:

>>> m=re.match('(?P<var>[a-zA-Z_]\w*)', 'abc=123')>>> m.group('var')'abc'>>> m.group(1)'abc'(?P=name)

匹配之前以name命名的组里的内容。
演示一下:
复制代码 代码如下:

>>> re.match('<(?P<tagname>\w*)>.*</(?P=tagname)>', '<h1>xxx</h2>')  #这个不匹配 首先\w匹配name属性再来匹配P=tagname>>> re.match('<(?P<tagname>\w*)>.*</(?P=tagname)>', '<h1>xxx</h1>')  #这个匹配<_sre.SRE_Match object at 0xb69588e0>

(?#…)
注释,圆括号里的内容会被忽略。

(?=…)
如果 … 匹配接下来的字符,才算匹配,但是并不会消耗任何被匹配的字符。例如 Isaac (?=Asimov) 只会匹配后面跟着 ‘Asimov’ 的 ‘Isaac ‘,这个叫做“前瞻断言”。

(?!…)
和上面的相反,只匹配接下来的字符串不匹配 … 的串,这叫做“反前瞻断言”。

(?<=…)
只有当当前位置之前的字符串匹配 … ,整个匹配才有效,这叫“后顾断言”。字符串’abcdef’可以匹配正则(?<=abc)def,因为会后向查找3个字符,看是否为abc。所以内置的子RE,需要是固定长度的,比如可以是abc、a|b,但不能是a*、a{3,4}。注意这种RE永远不会匹配到字符串的开头。举个例子,找到连字符(’-‘)后的单词:

复制代码 代码如下:

>>> m = re.search('(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'(?<!...)

同理,这个叫做“反后顾断言”,子RE需要固定长度的,含义是前面的字符串不匹配 … 整个才算匹配。

(?(id/name)yes-pattern|no-pattern)
如有由id或者name指定的组存在的话,将会匹配yes-pattern,否则将会匹配no-pattern,通常情况下no-pattern也可以省略。例如:(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)可以匹配 ‘<user@host.com>’ 和 ‘user@host.com‘,但是不会匹配 ‘<user@host.com‘。

0 0
原创粉丝点击