python模块之re模块和正则表达式

时间:2021-11-15 22:50:25

一.  re模块


 

  • re模块下的常用方法


 

    • 额外:
      • 几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
        • re.I(re.IGNORECASE): 忽略大小写
        • re.M(MULTILINE): 多行模式,改变’^’和’$’的行为 
        • re.S(DOTALL): 点任意匹配模式,改变’.’的行为 
        • re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定 
        • re.U(UNICODE): 使预定字符类 \w \W \b \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 匹配任意非数字
      #
      \n 匹配一个换行符
      #
      \t 匹配一个制表符
      #
      \b 匹配一个单词的结尾
      #
      ^ 匹配字符串的开始
      #
      $ 匹配字符串的结尾
      #
      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
        <组名>)可以定义组名