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

正则对于文本文字处理很好用,以前总是觉得很难似的,认真的学习一下发现入门还是很简单的。
首先说的是元字符:
[] :-常用来制定一个字符集,只能匹配一个字符 [abc]  匹配a,b或者 c
   -其他的元字符在[]中不起作用

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

import re
r='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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值