python模块之re模块和正则表达式 一.  re模块 re模块下的常用方法 二. 正则表达式


  • re模块下的常用方法


    • 额外:
      • 几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
        • re.I(re.IGNORECASE): 忽略大小写
        • re.M(MULTILINE): 多行模式,改变’^’和’$’的行为 
        • re.S(DOTALL): 点任意匹配模式,改变’.’的行为 
        • re.L(LOCALE): 使预定字符类 w W B s S 取决于当前区域设定 
        • re.U(UNICODE): 使预定字符类 w W B s S d D 取决于unicode定义的字符属性 
        • re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释  
  •  re.findall(pattern, string, flags=0) 功能是根据pattern 筛选出string中所有匹配的内容。返回值是一个列表。
# 正常匹配
s = "zhangsan lisi wanger mazi"
ret = re.findall('an', s,)  # 返回匹配的内容
print(ret) # 列表 :['an', 'an', 'an']

# flags
s = "zhAngsan lisi wAnger mazi"
ret = re.findall('an', s, re.I)
print(ret) # ['An', 'an', 'An']
# findall优先级:

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']
  • re.match(pattern, string, flags=0) 功能: 与search作用一致, 但是它是在字符串起始处开始匹配,倒是和startswith比较像, 返回值是一个对象 .需要 .group() 来获取值。 注意:如果没有匹配的内容则返回None
s = "zhangsan lisi wAnger mazi"
ret = re.match('zh', s) # 返回值,<_sre.SRE_Match object; span=(0, 2), match='zh'>
print(ret.group())

s = "zhangsan lisi wAnger mazi"
ret = re.match('an', s)
print(ret)   # None
print(ret.group()) # 报错
  • re.subn(pattern, repl, string, count=0, flags=0)   替换,替换匹配成功的内容。 返回值是一个元组,(string, 替换次数)
  • re.sub(pattern, repl, string, count=0, flags=0)  与subn作用一致, 只是返回值不同,sub返回值是字符串
# subn
s = "zhAngsan lisi wAnger mazi"
ret = re.subn('A', 'a', s, 1) #  1- count 指定替换次数
print(ret)  # ('zhangsan lisi wanger mazi', 2)


s = "zhAngsan lisi wAnger mazi"
def demo():
    return 'a'

ret = re.subn('A', demo(), s) # repl 可以用函数返回值
print(ret)  # ('zhangsan lisi wanger mazi', 2)

# sub
s = "zhAngsan lisi wAnger mazi"

def demo():
    return 'an'

print(re.sub('An', demo(), s, 1))   # zhangsan lisi wAnger mazi
  • re.complie(pattern, flags=0)  功能: 与内置函数complie很像, 将正则表达式规则编译成一个正则表达式对象
obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123
  • re.finditer(pattern, string, flags=0) 功能: 根据pattern筛选所有的匹配内容。与findall作用很相似,只是返回值不同,finditer返回值是一个迭代器。
s = "zhangsan lisi wanger mazi"
ret = re.finditer('an', s)
print(ret)  # <callable_iterator object at 0x028A85B0>

# print(next(ret))  # <_sre.SRE_Match object; span=(2, 4), match='an'>

print(next(ret).group())  # an next后 .group()

for itr in ret:
    print(itr.group())  # an an
  • re.search(pattern, string, flags=0) 功能: 根据pattern 筛选出string中第一个匹配项,并返回。 返回值:如果能找到匹配项,返回值是一个对象;如果找不到匹配项,返回值是None
s = "zhangsan lisi wanger mazi"
print(re.search('an', s).group())  # an
  • re.split(pattern, string, maxsplit=0, flags=0) 功能:根据pattern 分割string 。 返回值是列表。
s = "zhangsan|lisi|wanger|mazi"
ret = re.split(r'|', s)
print(ret)  # ['zhangsan', 'lisi', 'wanger', 'mazi']

ret = re.split(r'|', s, 1)  # maxsplit=1,指定分割次数
print(ret)  # ['zhangsan', 'lisi|wanger|mazi']
# re.split()优先级:

s = "zhangsan|lisi|wanger|mazi"
ret1 = re.split(r'|', s)
print(ret1)  # ['zhangsan', 'lisi', 'wanger', 'mazi'] 没有保留用来分割的匹配项。

ret2 = re.split(r'(|)', s)
print(ret2)  # ['zhangsan', '|', 'lisi', '|', 'wanger', '|', 'mazi']

# 匹配规则加括号,可以保留用来分割的匹配项。

二. 正则表达式


  • 元字符
    • # .(点)    匹配除换行符以外的任意字符
      # w        匹配字母或数字或下划线
      # s        匹配任意的空白符
      # d        匹配数字
      # W        匹配非字母或数字或下划线
      # S        匹配非空白字符
      # D        匹配任意非数字
      # 
              匹配一个换行符
      # 	        匹配一个制表符
      #         匹配一个单词的结尾
      # ^         匹配字符串的开始
      # $         匹配字符串的结尾
      # a|b       匹配a或b
      # (..)      匹配括号内的表达式,也表示一个组
      # [..]      匹配字符组中的字符
      # [^..]     匹配非字符组中的字符
  • 量词
    • # *      重复零次或更多次
      # +      重复一次或更多次
      # ?     重复零次或一次
      # {n}    重复n次
      # {n, }  重复n次或更多次
      # {n,m}  重复n到m次
  • 贪婪匹配,非贪婪匹配
    • 如上量词默认都是贪婪匹配
    • 非贪婪匹配:  在量词后面加上? 即可改变成非贪婪模式
      • # *?        重复任意次,但尽可能少重复
        # +?        重复1次或更多次,但尽可能少重复
        # ??        重复0次或1次,但尽可能少重复
        # {n,m}?    重复n到m次,但尽可能少重复
        # {n,}?     重复n次以上,但尽可能少重复
    • .*? 的用法
      • . 是任意字符
        * 是取 0 至 无限长度
        ? 是非贪婪模式。
        何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
        .*?x
        
        就是取前面任意长度的字符,直到一个x出现
  • 转义符
    •  转移具有特殊意义的字符
  • ?的用法:
      • 量词 : 量词:  代表重复零次或者1次
        findall优先级: (?:) 可以取消优先级
        非贪婪模式:  在贪婪模式的量词后面加?  可以改为非贪婪模式
        定义组名(..) : 在(?P<组名>)可以定义组名