[Python]python正则入门--基本元字符匹配操作

来源:互联网 发布:下載外帀手機软件 编辑:程序博客网 时间:2024/06/06 06:53
正则对于文本文字处理很好用,以前总是觉得很难似的,认真的学习一下发现入门还是很简单的。
首先说的是元字符:
[] :-常用来制定一个字符集,只能匹配一个字符 [abc]  匹配a,b或者 c
   -其他的元字符在[]中不起作用

   - '^'表示补集,'-'表示范围 

import rer='a[abc]c're.findall(r,'abc aac adc ')['abc', 'aac']r=r'a[bcd$]'re.findall(r,'ad')['ad']re.findall(r,'ab')['ab']r=r'[^abc]dd're.findall(r,'add cdd fdd')['fdd']r=r'[a-z]bc're.findall(r,'bbc ...abc')['bbc', 'abc']

^ :匹配行首

r=r'^abc're.findall(r,'abcd ...')['abc']re.findall(r,'bcd ...')[] 

$ :匹配行尾
r='abc$'re.findall(r,'bcd ...ab')[]re.findall(r,'bcd ...abc')['abc']

\ :转义 如果我们要去匹配的字符中含有元字符就会用到
#匹配字符串 ^#

r=r'\^#'re.findall(r,'ddcd ^# nihao ')['^#']r=r'^#'   #不用转义就无法匹配的到re.findall(r,'ddcd ^# nihao ')[]
其他的\常用组合:
\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]
.  匹配任何字符 出了换行符以外

 
#例如匹配0561-4564620之类的电话号码r=r'\d\d\d\d-\d\d\d\d\d\d\d're.findall(r,'4567-3451234')['4567-3451234']#例如匹配只有3位字母数字组成的126邮箱r=r'\w\w\w@126.com're.findall(r,'ly1@126.com')['ly1@126.com']re.findall(r,'ly*@126.com') #特殊字符就无法匹配的到[]re.findall(r,'45673451234')[]#例如密码必须6位字符r=r'^......$'re.findall(r,'11111')[]re.findall(r,'11111e')['11111e']re.findall(r,'11111e5')[]
上面例子限制的条件都很少,因为我们每次都只能用一个元字符限定一个字符的匹配,如果是匹配任意长得字符,或者不定长度的字符呢 或者字符中有些字符可以有也可以没有呢  
例如电话号码  010-3333333 0103333333 05614444444 0561-3333333 前面是3位或者4位中间'-'可有可无最后是7位数字的呢? 这就用到多重复匹配的元字符了

*  制定前面的一个字符可以匹配0次或者是多次
  a[bcd]*b --'abb' 'abbbccddb' 不限制次数只要匹配到就可以

r=r'\d*b'  #匹配数字后面有个d的串,不管前面多少个数字,甚至0个都行re.findall(r,'333b 4444 d4d')['333b']re.findall(r,'333b 4444 d4d  b')['333b', 'b']
+ -表示匹配一次或者多次, 至少要有一次

#看看和*的不同r=r'\d+b're.findall(r,'333b 4444 d4d  b 3b') #这里的b就没法匹配到了,因为前面至少要有一个数字['333b', '3b']
?匹配0次或者一次,可以有可以没有,最多只能有一个

r=r'\d-?\d're.findall(r,'3-4 34 3--4 d-4')['3-4', '34']  #有2个'-'的就无法匹配到了


|  :或得匹配,也就是经常用得or的意思

{n} {m,n} :可以精确的匹配次数,或者范围 


#例如上面的电话号码的例子r=r'^\d{3,4}-?\d{7}'re.findall(r,'0104444444')['0104444444']re.findall(r,'010-4444444')['010-4444444']re.findall(r,'0101-4444444')['0101-4444444']re.findall(r,'01014444444')['01014444444']re.findall(r,'010144444444') #为什么8位也行呢,原来没有制定7个数字结尾['01014444444']r=r'^\d{3,4}-?\d{7}$'re.findall(r,'010144444444')[] 
那这里我们是不是可以用{}来代替上面的 * + ?呢,当然可以
* {0,} +{1,} ?{0,1}
但是不建议那么用,还是用符号比较好


下面来说说re模块的一些方法:
re.compile() 当我们经常使用一些正则的时候就可以对他们进行预编译,然后使用,这样效率会提高。

r=r'^\d{3,4}-?\d{7}$'res=re.compile(r)<_sre.SRE_Pattern object at 0x0299B728> #生成一个正则对象res.findall('0103333333')['0103333333']

这里只是简要的入门下,还有些元字符和很多的re模块的用法需要多练习,贪婪和非贪婪匹配,search和match匹配的不同,还有一些split操作,取字串的操作,每个单词的边界操作,等等都需要理解以后在做笔记


本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/8736561