Python:正则表达式模块

1. 模式语法

.   #匹配任意除"\n"之外的字符
\   #转义字符
[...]   #字符集,形式诸如[abc]、[a-c]、[^abc],对应的位置可以是字符集中任意字符

2. 预定义字符集,可写在[…]中

\d  #数字[0-9]
\D  #非数字[^\d]
\s  #空白字符[<空格>\t\r\n\f\v]
\S  #非空白字符[^\s]
\w  #单词字符[A-Za-z0-9]
\W  #非单词字符[^\w]

3. 数量词(写在字符或(…)之后)

*   #匹配前一个字符0或无限次(如 abc* 可以匹配ab、abccc)
+   #匹配前一个字符1或无限次#匹配前一个字符0或1次
{m} #匹配前一个字符m次(如 ab{2}c 匹配abbc)
{m,n}   #匹配前一个字符m~n次

4. 边界匹配(不消耗待匹配字符串中的字符)

^   #匹配字符串开头
$  #匹配字符串末尾
\A  #仅匹配字符串开头
\Z  #仅匹配字符串末尾

5. 逻辑分组

|   #左右表达式任意匹配一个
(...)   #分组,作为一个整体,可以后接数量词,如 (abc){2} 匹配 abcabc
(?P<name>...)   #为分组指定一个别名,如(?P<id>abc)

6. 引用

(?P=name)   #用引用别名为name的分组匹配到的字符串,如 (?P<id>\d)abc(?P=id) 可以匹配 5abc5
\<number>   #引用编号为<number>的分组匹配到的字符串,如 (\d)abc\1 可匹配 5abc5

7. 特殊构造

(?:...)     # (...)的不分组版本
(?iLmsux)   #代表一个匹配模式
(?#...)     # #之后的内容作为注释被忽略
(?=...)     # =之后的字符串需要匹配,表达式才能成功匹配
(?!...)     # !之后的字符串需要不匹配,表达式才能成功匹配
(?<=...)        # =之前的字符串需要匹配,表达式才能成功匹配
(?<!...)        # !之前的字符串需要不匹配,表达式才能成功匹配
(?(id/name) yes-pattern|no-pattern) 
# 如果编号为id或别名为name的分组匹配成功,则需要匹配yes-pattern,否则需要匹配no-pattern,no-pattern可以忽略。

8. 原生字符串

r'abc\t\n'

>>> 输出:abc\t\n

原生字符串可以避免转义字符的困扰。

9. re模块和Pattern对象

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造

a=re.compile(strPattern[,flag]) #flag是匹配模式

Pattern提供了几个可读属性用于获取表达式的相关信息:
pattern: 编译时用的表达式字符串。
flags: 编译时用的匹配模式。数字形式。
groups: 表达式中分组的数量。
groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。

import re

p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups:", p.groups
print "p.groupindex:", p.groupindex

### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}

9.1 match和search

match和search有点类似,都可以匹配模式,但是也有区别。match只能够在字符串的开始位置进行匹配,而search是可以匹配字符串的任意位置,但也是返回找到的第一个匹配的模式,否则返回none。

作为函数

re.match(strPattern,string)是一次匹配的结果,可以通过match提供的属性或方法来获取信息。
属性:string、re、pos、endpos、lastindex、lastgroup
方法

m.group([group1,...])   #获得一个或多个分组截获的字符串,group(0)表示整个匹配字符串
m.groups()      #以元组形式返回全部分组截获的字符串
m.groupdict()   #返回以别名为键,截获的字符串为值的字典
m.start([group])    #返回指定的组截获的子串在string中的起始位置
m.end([group])      #返回指定的组截获的子串在string中的结束位置
m.span([group])     #返回 (start(group),end(group))
m.expand(r'\1\2\3')     #将分配到的分组代入到r'...'中然后返回

例子:

m=re.search('cn','www.ddd.cn')
m.group()
>>>'cn'

作为方法

m=a.search('hello world!')

9.2 split

m.split(string[,maxsplit])re.split(pattern,string[,maxsplit]) 按照匹配成功的子串将string分割,并返回列表

作为方法

例子:

m=re.compile(r'world')
print m.split('hello world you!')
>>> ['hello ',' you!']

9.3 findall

findall(string[,pos[,endpos]])搜索string,以列表的形式返回所有能匹配的子串

9.4 finditer

finditer(string[,pos[,endpos]])返回一个顺序访问每个结果(match对象)的迭代器

9.5 sub

sub(repl,string[,count])使用repl替换string中每个匹配的子串后返回替换后的字符串
例子:

p=re.compile(r'(\w+)(\w+)')
s='I say,hello world!'
t=p.sub(r'\2 \1',s)

>>>t='say I,world hello!'

9.6 subn

subn(repl,string[,count]) 返回 (sub(repl,string[,count]),替换次数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值