随笔--正则表达式进阶

1.避免转义字符引起的问题

  • 使用原字符串定义正则表达式

    p = r'正则表达式'

  • []中用^取反

  • \s 匹配到的空格都有[\t\n\f\v\r]

2. 分组的进阶

  • 分组(捕获分组:只捕获分组中内容,其他只要匹配即可)
    • group()返回匹配的字符串
  • groups()以元组的形式返回符合所有组中匹配的字符串,一个组为一个字符串

    • group(n) 第n个分组中匹配到的内容str,组编号是从 1 开始的
  • start() 返回匹配的起始位置

    • end() 返回匹配的结束位置
  • span(group=0) 返回匹配的索引位置元组

    • span(group=n) 返回匹配第n个组的索引位置
    • 出现(){m}一个分组匹配多次的这种情况,span()会将这个组的最后一次匹配索引位置输出
import re

p1 = r'(123){2}(da)'

m = re.search(p1,'55123123dasdasda123123asd')
print(m)
print(m.group())
print(m.groups())
print(m.group(1))


// 输出
<_sre.SRE_Match object; span=(2, 10), match='123123da'>
123123da
('123', 'da')
123


【注】(123){2}只分了一个组,{2}只是指匹配两次
  • 分组命名

(?P<分组名>正则表达式)

  • 反向引用分组 (在后期爬虫会用到 )

p = r‘<([\w]+)>.*</\1>’

\1指引用分组([\w]+)匹配到的内容,进行匹配

import re
regex = re.compile(r'\d+')
str1 = '55123123dasdasda123123'
regex2 = re.compile(r'((\w)\w*?\2)')
allstr2 = regex2.findall(str1)

print(allstr2)
# [('55', '5'), ('1231', '1'), ('23dasdasda12', '2'), ('3123', '3')]
  • 非捕获分组

介绍:只是将小括号作为一个整体进行匹配,要捕获整个正则表达式

使用:(?:正则表达式)

3. 编译正则表达式

re.compile(pattern[,flags=0])

  • 使用方式

    re.flag名 简写和全称都可以

标识含义
re.S ---- re.DOTALL使得.匹配包括换行符在内的所有字符(’.'不包含换行符)
re.I ---- re.IGNORECASE使得匹配对大小写不敏感
re.M ---- re.MUTILINE多行匹配。(影响^和$)
re.X ---- re.VERBOSE能够让正则表达式组织(表现)的清晰易懂。为了增加可读性,忽略空格和 # 后面的注释
re.A — re.ASCII采用ASCII编码
re.U — re.UNICODE采用UNICODE编码

4. 常用的方法(快速回忆)

1. re.match(pattern, string, flag=0)
2. re.search(pattern, string, flag=0)
3. re.findall(pattern, string, flag=0) 返回一个列表
4. re.finditer(pattern, string, flag=0)
5. re.sub(pattern, rep1, string, count=0 , flag=0)
  • 替换字符串
  • count:替换次数;count默认为0,表示次数无限制
6. re.subn(pattern, rep1, string, flag=0 )
  • 替换字符串并返回替换的次数
7. re.spilt(pattern,string,maxsplit = 0,flag=0)
  • 切割字符串
  • maxsplit:为最大分割次数;maxsplit = 0, 默认为0,表示分割次数没有限制
8. re.compile(pattern, flag=0)
  • 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,提高效率
  • 多个标志使用’|'间隔开
  • 编译后的对象regex可以直接使用对应的方法
    • regex.方法(string,[, pos [, endpos ] ] )
      • string : 待匹配的字符串。
      • pos : 可选参数,指定字符串的起始位置,默认为 0。
      • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。设置超过字符串长度也不会报错
  • 实例:

regex = re.compile(r'\d+')
str1 = '55123123dasdasda123123'
allstr = regex.findall(str1,2,len(str1))
print(allstr)
['123123', '123123']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值