【正则表达式(二)】Python

1. 贪婪和非贪婪
贪婪模式:重复次数不确定时,尽可能多的向后匹配
字符:* + ? {m,n} 这四种情况下会产生贪婪模式
非贪婪模式:尽可能少地匹配内容,满足正则表达式含义即可
字符: *? +? ?? {m,n}?

正则表达式默认的重复匹配模式:贪婪模式

2.正则表达式分组
使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体
例:

abcd(ef)  匹配——> abcdef        其中ef是子组

子组的作用:

  1. 增加子组后对正则表达式整体匹配内容没有影响
  2. 子组可以改变重复元字符的重复行为
例: abcdef* ——> f重复      
     abcd(ef)* ——> ef重复 
  1. 子组在某些操作中可以对子组匹配内容单独提取
例: 
从一段字符中匹配出 http://www.baidu.com中的 http  
(http).*   ——> 返回   ['http://www.baidu.com', 'http']

子组使用的注意事项:

  1. 每个正则表达式可以有多个子组,从外到内,从左到右为第一、二…子组
  2. 子组通常不要交叉

3. 捕获组和非捕获组(命名组和非命名组)
子组命名格式

(?P<name>正则表达式)      name为这个子组的名字
  1. 很多编程接口可以直接通过名字获取子组匹配内容
  2. 捕获组中的正则表达式可以通过名字重复调用,调用方式:(?P=name)
例:
(?P<dog>ab)cdef(?P=dog) ——> abcdefab
匹配身份证号:
re.search("\d{17}(\d|x)",'12345678932165424x').group()

4. 简单说一下几个常用的re模块吧

1.  compile(pattern, flags = 0)
功能:获取正则表达式对象
参数:pattern: 正则表达式
      flags: 功能表标志位,提供更加丰富的匹配
返回值:正则表达式对象
例: obj = re.compile(r'abcd')

re 模块和compile对象均有的函数:obj.findall(string, pos, endpos)
功能:通过正则表达式匹配字符串
参数:string  目标字符串
      pos     目标字符串的匹配开始位置
      endpos  目标字符串的结束位置
返回值:匹配到的所有内容以列表返回
PS: 如果正则表达式有子组,则只显示子组匹配内容
例:
pattern = r'ab'
# 获取正则表达式对象
obj = re.compile(pattern)
l = obj.findall("abcdabcabab", 6, 9) # 6表示从第六个开始匹配,9表示到第九个结束
print(l) # l = ['ab']

2. obj.split(string)
功能:按照正则表达式切割目标字符串
参数:目标字符串
返回值:切割后的内容
例:
pattern = r'\s+' # 至少一个空字符
obj = re.compile(pattern, flags = 0)
l = obj.split('hello world  hello kitty  nihao china')
print(l) # l = ['hello', 'world', 'hello', 'kitty', 'nihao', 'china']
3. obj.sub(replacestr, string, max)
功能:替换正则表达式所匹配到的内容
参数:replacestr 要替换的内容
      string     目标字符串
      max        最多替换几处
返回值: 返回替换后的字符串
例:
pattern = r'\s+'
obj = re.compile(pattern, flags=0)
s = obj.sub('##', 'hello world nihao China',2)
print(s)  # s = hello##world##nihao China
4. obj.subn(replacestr, string, count)
功能:替换正则表达式所匹配到的内容
参数:replacestr 要替换的内容
      string     目标字符串
      count      最多替换几处
返回值: 返回替换后的字符串和实际替换的个数
例:
pattern = r'\s+'
obj = re.compile(pattern, flags=0)
s = obj.subn('##', 'hello world nihao China',2)
print(s)  #  s = ('hello##world##nihao China', 2)
 5.
obj.finditer()
功能: 使用正则表达式匹配目标内容
参数: 目标字符串
返回值: 迭代对象 迭代的每个内容为一个match对象
例:
# 匹配内容返回迭代器
it = re.finditer\
     (r'\d+', '2008年是个多事之秋,512地震 08奥运等')
for i in it :
    print(i)
结果:
<_sre.SRE_Match object; span=(0, 4), match='2008'>
<_sre.SRE_Match object; span=(12, 15), match='512'>
<_sre.SRE_Match object; span=(18, 20), match='08'>
6.
re.match(pattern, string)
功能: 匹配一个字符串的开头
参数: 目标字符串
返回值: 如果匹配到,则返回match obj
         没有匹配到,则返回 None
例:
# match匹配
obj = re.match('foo', 'foo, food on the table')
print(obj.group())  # 返回foo
7.  re.search(pattern, string)
功能: 匹配一个字符串
参数: 目标字符串
返回值: 如果匹配到,则返回match obj
         没有匹配到,则返回 None
PS: match 只能匹配字符串的开头位置,search可以匹配任意位置,但也只能匹配一次
PS: 通常match对象调用其属性时,往往需要try异常处理

8.  fullmatch()
    要求字符串完全匹配
PS:要捕获异常
例:
try:
    obj = re.fullmatch('\w+', 'abcde#123')
    print(obj.group())
except AttributeError as e :
    print(e)
结果返回: 'NoneType' object has no attribute 'group'

9.
group(n)
功能: 获取match 对象匹配到的内容
参数: 默认为0 表示获取正则整体的匹配内容
       如果传入大于0的正数则表示获取对应子组匹配内容
返回值: 返回匹配到的内容

10.
groups()
能能: 得到所有子组匹配内容

11.
groupdict()
功能: 得到所有捕获组内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值