python正则表达式使用

Python 正则表达式

  1. \d表示任意一位0~9的数字

例子:\d\d\d-\d\d\d\d-\d\d\d\d 匹配一个电话号码,格式为xxx-xxxx-xxxx

  1. {n} 大括号里面带数字n表示匹配前面的字符n次

例子:\d\d\d连续一样的匹配表达式可以写成\d{3}\d{4}\d{4}

  1. Python的所有正则表达式都在re模块中,使用前先导入 import re
  2. 匹配用法:phoneRegex = re.compile(r’\d{3}-\d{4}-\d{4}’)  ; mo = phoneRegex.search(‘my phone num 133-1234-2233’);  mo.group() 返回匹配的字符串。注意:如果匹配不上时,会返回这个异常aa 'AttributeError:NoneType' object has no attribute 'group'

小结:使用正则表达式的步骤,1).用import re导入正则表达式模块 2). 用re.compile()函数创建一个Regex对象(r‘user string’, 这种方式表示使用原始字符串,不会对‘\’做转义处理)3). 向Regex对象的search()方法传入想查找的字符串。它返回一个march对象 4). 调用march对象的group()方法,返回实际匹配的文本字符串。

  1. 分组,用圆括号表示(); 正则表达式第一对括号是第一组,第二对括号是第二组。

例子:phonenum = re.compile(r’(\d{3})-(\d{4}-\d{4})’),mo = phonenum.search(‘133-333-4567’), mo.group(1) 返回字符串‘133’, mo.group(2)返回字符串‘333-4567’,group中不传参数或传入0则返回整个匹配的字符串 mo.group(), mo.group(0) 返回’133-333-4567’

  1. 如果一次就获得所有分组,使用groups()方法 fstnum, scdnum = mo.groups(),fstnum值是’133’, scdnum值是‘333-4567’
  2. 管道,‘|’表示, 匹配多个分组;第一次匹配的文本将作为match对象返回

例子:heroRegx = re.compile(r’Batman | Tina Fey’); mo = heroRegx.search(r‘Batman and Tina Fey’) ; mo.group() 返回’Batman’

  1. 问号,‘?’实现可选匹配;字符?表明它前面的分组在这个模式中是可选的。

例子:batRegex = re.compile(r‘Bat(wo)?man’); mo1 = batRegex.search(‘The Adventures of Batman’) ; mo1.group() 返回’Batman’;   mo2 = batRegex.search(‘The Adventures of Batwoman’); mo2.group() 返回’Batwoman’

  1. 星号,‘*’ 匹配0次或多次;星号之前的分组可以在文本中出现任意多次
  2. 加号,‘+’ 匹配1次或多次;加号之前的分组至少出现1次
  3. 花括号,’{}’ 匹配特定次数; 想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例子:(Ha){3} 将匹配‘HaHaHa’。 除了一个数字,还可以指定一个范围 (Ha){3,5} 匹配’HaHaHa’,‘HaHaHaHa’,‘HaHaHaHaHa’, 或者(Ha){3,} ;(Ha){,5} 分别匹配3次及以上,0-5次
  4. 贪心匹配和非贪心匹配;python正则表达式默认是贪心匹配,这表示有二义的情况下,他们会尽可能匹配最长的字符串。花括号问号的非贪心版本匹配尽可能最短的字符串{}?,例子:匹配规则(Ha){3,5} 和(Ha){3,5}?,在同一个字符串’HaHaHaHaHa’中,规则1贪心匹配结果是‘HaHaHa’,规则2非贪心匹配结果是’HaHaHaHaHa’。问号在正则表达式中可能有两种含义:声明非贪心匹配或表示可选的分组,两种含义是完全无关的。
  5. findall()方法,search()方法只返回第一次匹配的文本,findall()可以返回全部匹配的结果。
  6. 字符分类:

缩写字符

表示

\d

0-9之间的数字

\D

除0-9数字以外的任何字符

\w

字母,数字,下划线字符

\W

除字母,数字,下划线字符的任何字符

\s

空格,制表符或换行符

\S

除空格,制表符或换行符以外的任何字符

  1. 建立自己的字符分类,方括号:有时候用上面的字符分类太宽泛,可以用方括号定义自己的字符分类。 例子[abcde], 字符分类将只匹配其中的a-e.  volReg=re.compile(r’[abcde]’) ; mo = voReg.findall(‘Hello world’); print(mo) 将返回列表[‘e’,’d’]
  2. ’^’ 和 ‘$’;^表明匹配必须发生在被查找文本的开始处。$表明该字符串必须以这个正则表达式的模式结束。可以同时使用^和$。例子^\d+$ 匹配从开始到结束都是数字的字符串
  3. 通配字符,‘.’ 句点;它匹配除了换行之外的所有字符。句点字符只匹配一个字符
  4. 匹配换行字符,re.compile()的第二个参数传入re.DOTALL来匹配包括换行字符的所有字符, 例子:newRegex = re.compile(r’.*’, re.DOTALL); newRegex.search(‘Server the pu \n protect’) ; 返回‘Server the pu \n protect’

复习:?匹配0次或1次前面的分组

*匹配0次或多次前面的分组

+匹配1次或多次前面的分组

{n}匹配n次前面的分组

{n,}匹配n次及以上的分组

{,m}匹配0次到m次的分组

{n,m}匹配n到m次的分组

{n,m}?对前面的分组进行非贪心匹配

^spam字符串必须以spam开始

$spam字符串必须以spam结束

.匹配所有单个字符,换行符和空格除外

[abc]匹配方括号内的任意字符

[^abc]匹配不在方括号内的任意字符

  1. 不区分大小写的匹配,re.compile()第二个参数传入re.IGNORECASE或re.I
  2. 替换字符串,sub()方法,找到字符串后,想要替换到找到的字符串。例子:nameRegex=re.compile(r’Agent \w+’); nameRegex.sub(‘CENSORED’, ‘Agent Alice gave the’); 返回结果’CENSORED Alice gave the’
  3. re.VERBOSE, 复杂的正则表达式可以分开多行写,并且加上注释,这时第二个参数需要re.VERBOSE。
  4. re.I re.DOTALL 和re.VERBOSE组合使用时用‘|’连接

 

关于异常aa的处理:使用下面格式,异常发生时不会导致程序崩溃

try :

正常的业务处理逻辑

except(AttributeError) :

异常发生时的处理逻辑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值