python笔记3-梳理正则表达式(持续更新)

1,格式

  • 关于Escape符:
    反斜线字符 \ 作为Escape符,让特殊字符失去含义 在以 'r' 为前缀的字符串文字中不以任何特殊方式处理反斜杠。所以 r"\n" 是包含 \ 和 'n' 的两个字符的字符串,而 "\n" 是包含换行符的单字符字符串
  • 结论: python的正则表达式推荐写成 r"str" 这样的形式

2,部分特殊符号(更新):

- ^ 匹配开头
- $ 匹配结尾
- * + 贪婪匹配
- *? +? 非贪婪(最小方式)匹配
- [] 里面的特殊字符失效,表示本身,如果[]中的第一个字符是 '^' ,则不匹配的所有字符将被匹配
- \s 空白字符
复制代码

3,正则表达式对象:

  • pattern
    我们要让这个制定规则的字符串变成正则表达式,需要将这个字符串编译一下,成为表达式对象,这个对象又称pattern,即样式。
regex = r'具体规则'
pattern= re.compile(regex,flags=0)
复制代码

4,正则表达式对象(Pattern)支持的方法:

  • pattern.search(string[,pos[,endpos]])
    扫描字符串查找第一个能匹配上pattern的部分,并返回相应的匹配对象(Match)。从指定的pos开始搜索
  • pattern.match(string[,pos[,endpos]])
    如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的匹配对象(Match)。 如果字符串与模式不匹配,则返回None
  • pattern.fullmatch(string[,pos[,endpos]])
    同上,但要求全部匹配。(python3才有的!!!python2不支持)
  • pattern.split(string,maxsplit=0)
    返回根据regex进行split分割后的列表(最多发生maxsplit分割)
regex = r'[0-9]'
pattern = re.compile(regex)
pattern.split('5sdf2ad1adf9adf0')
# ['', 'sdf', 'ad', 'adf', 'adf', '']

regex = r'[0-9]'
pattern = re.compile(regex)
pattern.split('5sdf2ad1adf9adf0',2)
# ['', 'sdf', 'ad1adf9adf0']
复制代码
  • pattern.findall(string[,pos[,endpos]])
    字符串从左到右扫描,匹配按照找到的顺序返回列表
regex = r'[0-9]+'
pattern = re.compile(regex)
pattern.findall('jh22nf43ns43ho7ah94')
# ['22', '43', '43', '7', '94']
复制代码

分组的情况:只返回组内的内容

regex = r'[0-9]+([0-9])'
pattern = re.compile(regex)
pattern.findall('jh22nf43ns43ho7ah94')
# ['2', '3', '3', '4']
复制代码

分两组的情况:返回列表,每个元素是元组

regex = r'[0-9]*([0-9])([0-9])'
pattern = re.compile(regex)
pattern.findall('jh22nf43ns43ho7ah94')
# [('2', '2'), ('4', '3'), ('4', '3'), ('9', '4')]
复制代码
  • pattern.sub(repl,string,count=0)
    replace函数的加强,先通过正则表达式规则找到string中符合规则的部分,然后替换成repl。返回字符串
regex = r'\d{3}'
pattern = re.compile(regex)
pattern.sub('OOO','87has100bmn010vzx686v')
# '87hasOOObmnOOOvzxOOOv'
复制代码

分组的情况:repl可以引用分组,最好写成r'...'的形式

regex = r'\d{2}(\d)'
pattern = re.compile(regex)
pattern.sub(r'\1','87has103bmn010vzx686v')
# '87has3bmn0vzx6v'
复制代码

(repl还可以是函数)

5,正则表达式对象的属性:

pattern.flags : pattern = re.compile(r'd',flags=re.IGNORECASE) #忽略大小写
复制代码

......

6,re模块儿的自带函数:

正常是上面的步骤,但re直接提供了search,findall,match等快捷操作

7,Match Object匹配的结果对象

pattern.search()和match()方法返回的是一个匹配对象,里面除了包装好子字符串,还提供其它的功能,因为,我们在写规则的时候有通过捕获括号对规则进行分组,因此,我们也可以通过匹配对象把分组给提取出来。 由于match()和search()在不匹配时返回None,因此可以通过简单的if语句测试是否成功匹配

regex = r'hello'
pattern.search('myhelloworld')
match = pattern.search('helloworld')
if match:
    print("ok") # ok
复制代码

匹配对象Match的方法如下:

match.group([...])
regex = r'[0-9]+([0-9])'
pattern = re.compile(regex)
match = pattern.search('jh23nf43ns43ho7ah94')
if match:
    print(True)
    g_0 = match.group(0) # 匹配所有
    print(g_0) # 23
    g_1 = match.group(1) # 匹配第一个括号
    print(g_1) # 3
    g_0_1 = match.group(0,1) # 返回所有匹配的的元组
    print(g_0_1) ('23', '3')

match.groups() 返回一个包含匹配所有子组的元组,从1开始
regex = r'[0-9]+([0-9])'
pattern = re.compile(regex)
match = pattern.search('jh23nf43ns43ho7ah94')
if match:
    print(match.groups()) # ('3',)
复制代码

8,实例补充:

......

参考:

www.jianshu.com/p/147fab022…
lier.space/2018/04/29/…

猜你喜欢

转载自blog.csdn.net/weixin_34072159/article/details/91399071