python 正则表达式

正则表达式的用来完成一些 搜寻和匹配,

它有一些专用的字符和模式:http://www.runoob.com/python/python-reg-expressions.html

我们看一些常用的小案例:

正则表达式:
匹配对象以及group()和groups()方法
  group()要么返回整个对象,要么根据要求返回特定的子组。groups()则仅返回一个包含
唯一或者全部子组的元组。如果没有子组的要求,那么当group()仍然返回整个匹配时,groups
()返回一个空字组。
使用match()方法匹配字符串
  match()函数试图从字符串的起始部分对模式进行匹配,如果匹配成功,就返回一个匹配对象,
如果匹配失败,就返回None,用group()来显示匹配成功的内容


import re   #导入re模块

m = re.match('foo','foo')   #模式匹配字符串
if m is not None:           #如果匹配成功,就输出匹配内容
    print(m.group())
print(m)
结果:foo
      <_sre.SRE_Match object; span=(0, 3), match='foo'> # 这里输出的是它匹配的范围和内容
相反:如果是错误就什么也不会输出 如:
m = re.match('foo','fot')    #模式并不能匹配字符串
if m is not None:
    print(m.group())
结果:为空

m = re.match('foo','food on the table')
print(m.group())
结果:foo

print(re.match('foo','food on the table').group())
结果:foo

使用search()在字符串中查找模式

m = re.search('foo','seafood')
if m is not None:
    print(m.group())  #search()是搜寻  match()是匹配  他们的含义不同
print(m)
结果:foo
      <_sre.SRE_Match object; span=(3, 6), match='foo'>

匹配多个字符串
使用了(|)符号,如:bat|bet|bit

bt = 'bat|bet|bit'        #正则表达式模式:bat bet bit
m = re.match(bt,'bat')    #'bat'是一个匹配
m = re.match(bt,'bat')
if m is not None:
    print(m.group())
结果:bat

m = re.match(bt,'blt')  #对于‘blt'没有匹配
if m is not None:
    print(m.group())
结果:为无
m = re.match(bt,'He bit me')  #不能匹配字符串
if m is not None:
    print(m.group())
结果:为无
m = re.search(bt,'He bit me')  #通过搜寻查找’bit'
if m is not None:
    print(m.group())
结果:bit

匹配任何单个字符
(.)不能匹配一个换行符\n或者非字符,就是说一个空字符串

anyend = '.end'
m = re.match(anyend,'bend')    #点号匹配‘b'
if m is not None:
    print(m.group())
结果:bend
m = re.match(anyend,'end')     #不匹配任何字符
if m is not None:
    print(m.group())
结果:为无
m = re.match(anyend,'\nend')   # 除了\n之外的任何字符
if m is not None:
    print(m.group())
结果:为无
m = re.search('.end','The end.') #在搜寻中匹配
if m is not None:
    print(m.group())
结果:' end'  end前的空格也会输出

(\.)这个就不一样了,使用一个反斜杠对句点的功能进行转义

patt314 = '3.14'             # 表示正则表达式的点号
pi_patt = '3\.14'            #表示字面量的点号(dec.point)
m = re.match(pi_patt,'3.14') #精确匹配
if m is not None:
    print(m.group())
结果:3.14
m = re.match(patt314,'3014')  #点号匹配’0‘
if m is not None:
    print(m.group())
结果:3014
m = re.match(patt314,'3.14')  #点号匹配’.'
if m is not None:
    print(m.group())
结果:3.14

创建字符集([])
看看 [cr][23][dp][o2]和r2d2|c3po 之间的差别  r2d2|c3po要比[cr][23][dp][o2]更严格

m = re.match('[cr][23][dp][o2]','c3po') #匹配’c3po'
if m is not None:
    print(m.group())
结果:c3po
m = re.match('[cr][23][dp][o2]','c2do')  #匹配'c2do'
if m is not None:
    print(m.group())
结果:c2do
m = re.match('r2d2|c3po','c2do')   #不匹配 'c2do'
if m is not None:
    print(m.group())
结果:为无
m = re.match('r2d2|c3po','r2d2')   #匹配'r2d2'
if m is not None:
    print(m.group())
结果:r2d2

重复,特殊字符以及分组

patt = '\w+@(\w+\.)?\w+\.com' #\w 是匹配任何字面数字字符,与[A-Z a-z 0-9]相同
print(re.match(patt, 'nobody@xxx.com').group()) #   .com前面可以有一个和两个名称
结果:nobody@xxx.com

patt = '\w+@(\w+\.)?\w+\.com'
print(re.match(patt, 'nobody@www.xxx.com').group())
结果:nobody@www.xxx.com

#将?换成 * 的对比
patt = '\w+@(\w+\.)*\w+\.com'
print(re.match(patt, 'nobody@www.xxx.yyy.zzz.com').group())
结果:nobody@www.xxx.yyy.zzz.com

#子组
m = re.match('(\w\w\w)-(\d\d\d)','abc-123')
print(m.group())     #完全匹配   abc-123
print(m.group(1))    #子组1      abc
print(m.group(2))    #子组2      123
print(m.groups())    #全部子组   ('abc', '123')

m = re.match('ab','ab')     #没有字组
print(m.group())             #完全匹配   ab
print(m.groups())            #全部字组   ()

m = re.match('(ab)','ab')     #一个字组
print(m.group())              #完全匹配  ab
print(m.group(1))             #子组1     ab
print(m.groups())             #全部子组  ('ab',)

m = re.match('(a)(b)','ab')   #两个子组
print(m.group())              #完全匹配   ab
print(m.group(1))             #子组1      a
print(m.group(2))             #子组2      b
print(m.groups())             #全部子组   ('a','b')

m = re.match('(a(b))','ab')   #两个子组
print(m.group())              #完全匹配    ab
print(m.group(1))             #子组1       ab
print(m.group(2))             #子组2       b
print(m.groups())             #全部子组    ('ab','b')

#匹配字符串的起始和结尾以及单词边界
m = re.search('^The','The end.')      #匹配   ^起始的
if m is not None:
    print(m.group())   # The

m = re.search('^The','end. The')      #不作为起始
if m is not None:
    print(m.group())   # None

m = re.search(r'\bthe','bite the dog')  #在边界    \b 字符边界 和 \B相反
if m is not None:
    print(m.group())   # the

m = re.search(r'\bthe','bitethe dog')  #有边界
if m is not None:
    print(m.group())   # None

m = re.search(r'\Bthe','bitethe dog')  #在边界
if m is not None:
  print(m.group())   #the

# 使用findall() findeter() 查找每一次出现的位置
  与match() search()的不同之处在于,findall()总是返回一个列表,没有匹配返回一个空
列表,匹配成功列表将包含所有成功的部分从左到右输出
print(re.findall('car','car'))     # ['car']
print(re.findall('car','scary'))   # ['car']
print(re.findall('car','carry the barcardi to the car')) # ['car', 'car', 'car']

# 使用findall() findeter() 查找每一次出现的位置
print(re.findall('car','car'))     # ['car']
print(re.findall('car','scary'))   # ['car']
print(re.findall('car','carry the barcardi to the car')) # ['car', 'car', 'car']

s = 'This and that.'
print(re.findall(r'(th\w+) and (th\w+)',s,re.I))  #  [('This', 'that')]

m = re.finditer(r'(th\w+) and (th\w+)',s)
if m is not None:
    print(m)  #  <callable_iterator object at 0x03C85A90>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值