python re 正则表达式学习总结

  • 2020 年 1 月 13 日
  • 筆記

# -*- coding: utf-8 -*-  import re  import os    #------------------------------------- re(正则表达式)模块 --------------------------------  #-----------------------------------------------------------------------------------------------------  #------------------------------------- 概念 --------------------------------  #-----------------------------------------------------------------------------------------------------  '''  正则表达式:又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),  计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,  正则表达式通常被用来检索、替换那些符合某个模式的文本。    Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,  然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。  '''  #-----------------------------------------------------------------------------------------------------  #------------------------------------- 元字符 --------------------------------  #-----------------------------------------------------------------------------------------------------    '''  元字符(Meta-Characters)是正则表达式中具有特殊意义的专用字符,用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。    . 表示任意字符  [] 用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。  ^ 如果放在字符串的开头,则表示取非的意思。[^5]表示除了5之外的其他字符。而如果^不在字符串的开头,则表示它本身。   可以看成转意字符(同C语言)  | 表示或 左右表达式各任意匹配一个,从左边先匹配起,如果成功,则跳过右边的表达式.如果没有放在()中,则范围是整个表达式    具有重复功能的元字符  * 对于前一个字符重复"0~无穷"次  + 对于前一个字符,重复"1~无穷"次  ? 对于前一个字符,重复"0~1"次  {m,n} 对于前一个字符,重复"m~n"次,其中{0,}等价于*, {1,}等价于+, {0,1}等价于?  {m,n}? 对前一个字符,重复"m~n"次,非贪婪模式  {m} 对前一个字符,重复"m"次    d 匹配十进制数, 等价于[0-9]  D 匹配任意非数字字符, 等价于[^0-9]  s 匹配任何空白字符, 等价于[<空格>fnrtv]  S 匹配任何非空白字符, 等价于[^<空格>fnrtv]  w 匹配任意单词字符(构成单词的字符,字母,数字,下划线), 等价于[a-zA-Z0-9_]  W 匹配任意非单词字符(构成单词的字符,字母,数字,下划线), 等价于[^a-zA-Z0-9_]  A 匹配字符串的开头  Z 匹配字符串的结尾    以下是(?...)系列 这是一个表达式的扩展符号。'?'后的第一个字母决定了整个表达式的语法和含义,除了(?P...)以外,表达式不会产生一个新的组。    (?iLmsux) 'i'、'L'、'm'、's'、'u'、'x'里的一个或多个字母。表达式不匹配任何字符,但是指定相应的标志:re.I(忽略大小写)、re.L(依赖locale)、re.M(多行模式)、re.S(.匹配所有字符)、re.U(依赖Unicode)、re.X(详细模式)。  (?P<name>...) 除了原有的编号外再额外指定一个别名  (?P=name...) 引用别名name分组找到的字符串  (?#...) #后面的将被作为注释, 相当于表达式中的注释  (?:...) 匹配内部的RE所匹配的内容,但是不建立组。  (?=...) 如果 ... 匹配接下来的字符,才算匹配,但是并不会消耗任何被匹配的字符,这个叫做“前瞻断言”。  (?!...) 如果 ... 不匹配接下来的字符,才算匹配, 和(?=...)相反  (?<=...) 只有当当前位置之前的字符串匹配 ... ,整个匹配才有效,这叫“后顾断言”。  (?<!...) 只有当当前位置之前的字符串不匹配 ...,整个匹配才有效, 和(?<=...)相反  '''    #-------------------- . -----------------  """  . 在默认模式下,匹配除换行符外的所有字符。在DOTALL模式下,匹配所有字符,包括换行符。  """  s = 'hellonworld!'  m = re.findall('.', s)  print(m)  #['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!']    m1 = re.findall('.', s, re.DOTALL)  print(m1)  #['h', 'e', 'l', 'l', 'o', 'n', 'w', 'o', 'r', 'l', 'd', '!']    s2 = ''  m2 = re.findall('.', s2, re.DOTALL)  print(m2)  #[]    #-------------------- [] -----------------  s = 'hello world!'  m = re.findall('[adf]', s)  #字符集表示法, 匹配a或d或f的字符  print(m)  #['d']    n = re.findall('[a-e]', s)  #区间表示法, 匹配a~e的字符  print(n)  #['e', 'd']    #-------------------- ^ -----------------  """  ^ "^abc" 放在字符串abc的开头表示匹配以abc开始的字符串    "ab^c" 暂时不明    "abc^" 暂时不明    [^abc] 放在[]中的开头表示取反, 表示非abc之外的其它字符    [ab^c] 中的非开头表示普通字符^    [abc^] 放在在[]内尾位,就只代表普通字符^  """  s = 'hello world! [^_^]'  m = re.findall('^hel', s)  print(m)  #['hel']    m1 = re.findall('h^el', s)  print(m1)  #[]    m2 = re.findall('hel^', s)  print(m2)  #[]    m3 = re.findall('[^hel]', s)  print(m3)  #['o', ' ', 'w', 'o', 'r', 'd', '!', ' ', '[', '^', '_', '^', ']']    m4 = re.findall('[h^el]', s)  print(m4)  #['h', 'e', 'l', 'l', 'l', '^', '^']    m5 = re.findall('[hel^]', s)  print(m5)  #['h', 'e', 'l', 'l', 'l', '^', '^']    #--------------------  -----------------  """   转意字符  """    s = 'hello world!^_^'  m = re.findall('[^a-h]', s)  #匹配非a~h的所有字符  print(m)  #['l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', '!', '^', '_', '^']    m1 = re.findall('[^a-h]', s)  #^被转意了,使之变成了普通字符的意思, 匹配非a~h和^字符  print(m1)  #['h', 'e', 'd', '^', '^']      #-------------------- * -----------------  """  * 匹配0~无穷个前面的字符, 如何只想匹配*字符,可以写*或者[*],  *等价于[*]  """    s = 'hello world! yes! ^_^'  m = re.findall('el*', s)  #匹配el(l数量为0~无穷)  print(m)  #['ell', 'e']    s = '*****hello***'  m = re.findall('[*]*', s) #匹配查找**字符串  print(m)  #['**', '**', '**']    #-------------------- ? -----------------  """  ? 匹配0~1个前面的字符  """    s = 'hello world! yes! ^_^'  m = re.findall('el?', s)  #匹配el(l数量为0~1)  print(m)  #['el', 'e']    #-------------------- + -----------------  """  + 匹配1~无穷个前面的字符  """    s = 'hello world! yes! ^_^'  m = re.findall('el+', s)  #匹配el(l数量为1~无穷)  print(m)  #['el']    #-------------------- | -----------------  """  | 表示或 左右表达式各任意匹配一个,从左边先匹配起,如果成功,则跳过右边的表达式.如果没有放在()中,则范围是整个表达式  """    s = 'hello world! yes! ^_^'  m = re.findall("e|o", s)  print(m)  #['e', 'o', 'o', 'e']    #-------------------- {} -----------------  """  {m} 表示前面的正则表达式m次copy  {m} 表示前面的正则表达式m次copy, 由于只有一个m,所以等价于{m}?, 所以一般不这么写  {m,n} 表示前面的正则表达式m~n次copy, 尝试匹配尽可能多的copy  {m,n}? 表示前面正则表达式的m到n次copy,尝试匹配尽可能少的copy  """    s = 'hello world! yes! ^_^'  m = re.findall("e{0,}l{1,6}o{1}", s)  print(m)  #['ell', 'l']    s = 'aaaaaaa'  m = re.findall('a{2}', s)  print(m)  #['aa', 'aa']  m = re.findall('a{2}?', s)  print(m)  #['aa', 'aa']  m = re.findall('a{2,5}', s)  print(m)  #['aaaaa', 'aa']  m = re.findall('a{2,5}?', s)  print(m)  #['aa', 'aa', 'aa']      #-------------------- () -----------------  """  () 表示一组, 同C语言  """    s = 'hello world! yes! ^_^'  m = re.findall('[(l+)|(es)]', s)  #匹配el(l数量为0~无穷)  print(m)  #['e', 'l', 'l', 'l', 'e', 's']    #-------------------- $ -----------------  """  $ 匹配字符串末尾,在多行(MULTILINE)模式中,匹配每一行的末尾.  """    s = 'hello foo1nworld foo2n'  m = re.findall('foo.$', s)  #匹配以foo.结尾的字符串foo.  print(m)  #['foo2']    s = 'hello foo1nworld foo2n'  m = re.findall('foo.$', s, re.M)  #多行模式re.M下, 匹配每行以foo.结尾的字符串foo.  print(m)  #['foo1', 'foo2']    #-------------------- A -----------------  """  A 匹配字符串开始.  """    s = 'hello world'  m = re.findall('Ahell', s)  print(m)  #['hell']    m = re.findall('Aell', s)  print(m)  #[]    #-------------------- Z -----------------  """  Z 匹配字符串结尾.  """    s = 'hello world'  m = re.findall('ldZ', s)  print(m)  #['ld']    m = re.findall('orlZ', s)  print(m)  #[]    #-------------------- (?P<name>...) -----------------  """  (?P<name>...) 除了原有的编号外再额外指定一个别名  """  m = re.match("(?P<first>w+) (?P<second>w+)", "hello world")  #匹配到第1个起别名'first',匹配到第2个起别名second  g = m.groupdict()  print(g)  #{'second': 'world', 'first': 'hello'}  print(g['first'])  #hello    #-------------------- number -----------------  """  number 引用编号为number的分组找到的字符串  """  m = re.findall('(d)he(d)llo(d)', '1he5llo2 3world4, 1he5llo5 3world4')  print(m)  #[('1', '5', '2'), ('1', '5', '5')]  m = re.findall('dhedllo2', '1he5llo2 3world4, 1he5llo5 3world4')  print(m)  #[]    #-------------------- (?iLmsux) -----------------  """  'i'、'L'、'm'、's'、'u'、'x'里的一个或多个字母。表达式不匹配任何字符,但是指定相应的标志:  re.I(忽略大小写)、re.L(依赖locale)、re.M(多行模式)、re.S(.匹配所有字符)、re.U(依赖Unicode)、re.X(详细模式)。  """  s = 'hello foo1nworld foo2n'  m = re.findall('foo.$', s)  print(m)  #['foo2']  m = re.findall('(?m)foo.$', s)  #等价于m = re.findall('foo.$', s, re.M)  print(m)  #['foo1', 'foo2']    s1 = 'HELLO WORLD'  m = re.findall('(?i)[a-z]', s1)  #等价于m = re.findall('[a-z]', s, re.)  print(m)  #['H', 'E', 'L', 'L', 'O', 'W', 'O', 'R', 'L', 'D']    #-------------------- (?P=name...) -----------------  """  (?P=name...) 引用别名name分组找到的字符串  """  #匹配到第1个起别名'first'+空格+匹配到第2个起别名second+逗号+别名first找到的结果作为搜索表达式的一部分  m = re.match("(?P<first>w+) (?P<second>w+),(?P=first)", "hello world,hello world")  g = m.groupdict()  print(g)  #{'second': 'world', 'first': 'hello'}  m = re.match("(?P<first>w+) (?P<second>w+) (?P<third>(?P=first))", "hello world hello world")  g = m.groupdict()  print(g)  #{'second': 'world', 'third': 'hello', 'first': 'hello'}    #-------------------- (?#...) -----------------  """  (?#...) #后面的将被作为注释, 相当于表达式中的注释  """  s = 'hello1 #12345'  m = re.findall('hew+d', s)  print(m)  #['hello1']    m = re.findall('hew+(?#前面这个表达式hew+意思是he和任意单词字符的组合)d', s)  print(m)  #['hello1']    #-------------------- (?=...) -----------------  """  (?=...) 如果 ... 匹配接下来的字符,才算匹配,但是并不会消耗任何被匹配的字符。  例如 Isaac (?=Asimov) 只会匹配后面跟着 'Asimov' 的 'Isaac ',这个叫做“前瞻断言”。  """  s = 'hellooookl world, help'  g = re.findall('hel', s)  print(g)  #['hel', 'hel']    g = re.findall('hel(?=lo)', s)  #遍历查找hel, (?=lo)位置跟着lo的才算  print(g)  #['hel']    #-------------------- (?!...) -----------------  """  (?!...) 和 (?!=...)正好相反。  """  s = 'hello world, help'  g = re.findall('hel(?!lo)', s)  #遍历查找hel, (?=lo)位置没有跟着lo的才算  print(g)  #['hel']    g = re.findall('hel(?!klo)', s)  #遍历查找hel, (?=klo)位置没有跟着klo的才算  print(g)  #['hel', 'hel']    #-------------------- (?<=...) -----------------  """  (?<=...) 只有当当前位置之前的字符串匹配 ... ,整个匹配才有效,这叫“后顾断言”。  """  s = 'hhello world, hkelp'  g = re.findall('el', s)  #遍历查找el  print(g)  #['el', 'el']    g = re.findall('(?<=h)el', s)  #遍历查找el, (?<=h)位置跟着h的才算  print(g)  #['el']    #-------------------- (?<!...) -----------------  """  (?<!...) 只有当当前位置之前的字符串不匹配 ... ,整个匹配才有效,和(?<=...)功能相反.  """  s = 'hello world, hkelp'  g = re.findall('el', s)  #遍历查找el  print(g)  #['el', 'el']    g = re.findall('(?<!h)el', s)  #遍历查找el,(?<!h)的位置没有跟着h的才算  print(g)  #['el']    g = re.findall('(?<!m)el', s)  #遍历查找el, (?<!m)的位置没有跟着m的才算  print(g)  #['el', 'el']    #-----------------------------------------------------------------------------------------------------  #------------------------------------- 数量词的贪婪模式与非贪婪模式 --------------------------------  #-----------------------------------------------------------------------------------------------------  """  正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),  总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",  将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。  """    s = 'abbbbb'  g = re.findall('ab+', s)  print(g)  #['abbbbb']    g = re.findall('ab+?', s)  print(g)  #['ab']    #-----------------------------------------------------------------------------------------------------  #------------------------------------- 反斜杠 --------------------------------  #-----------------------------------------------------------------------------------------------------  """  与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",  那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,  转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\"表示。  同样,匹配一个数字的"\d"可以写成r"d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。  """    s = 'abc12\df3g4h'  pattern = r'd\'  pattern_obj = re.compile(pattern)  g = re.findall(pattern_obj, s)  print(g)  #['2\']    #-----------------------------------------------------------------------------------------------------  #------------------------------------- 函数部分 --------------------------------  #-----------------------------------------------------------------------------------------------------    #-------------------- re.compile(strPattern[, flag]) -----------------  """  re.compile(strPattern[, flag]):    这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。  第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。  另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。  可选值有:    re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)  M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)  S(DOTALL): 点任意匹配模式,改变'.'的行为  L(LOCALE): 使预定字符类 w W b B s S 取决于当前区域设定  U(UNICODE): 使预定字符类 w W b B s S d D 取决于unicode定义的字符属性  X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:    a = re.compile(r'''d +  # the integral part                     .    # the decimal point                     d *  # some fractional digits''', re.X)  b = re.compile(r"d+.d*")  re提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,  但同时也无法复用编译后的Pattern对象。如下面这个例子可以简写为:  """    s = 'hello world'  p = re.compile('hello')  match = re.match(p, s)  if match:      print(match.group())  #hello    #上面例子等价于(可以简写为)  match = re.match('hello', 'hello world')  print(match.group())  #hello      #-------------------- re.match(pattern, string, flags=0) -----------------  """  Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。    属性:  string: 匹配时使用的文本。  re: 匹配时使用的Pattern对象。  pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。  endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。  lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。  lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。    方法:  group([group1, …]):  获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,  返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。    groups([default]):  以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。    groupdict([default]):  返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。    start([group]):  返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。    end([group]):  返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。    span([group]):  返回(start(group), end(group))。    expand(template):  将匹配到的分组代入template中然后返回。template中可以使用id或g<id>、g<name>引用分组,但不能使用编号0。id与g<id>是等价的;  但10将被认为是第10个分组,如果你想表达1之后是字符'0',只能使用g<1>0。  """  match = re.match(r'(w+) (w+)(?P<sign>.*)', 'hello world!')  print(match.string)  #hello world!  print(match.re)  #<_sre.SRE_Pattern object at 0x100298e90>  print(match.pos)  #0  print(match.endpos)  #12  print(match.lastindex)  #3  print(match.lastgroup)  #sign  print(match.groups())  #('hello', 'world', '!')  print(match.group(0))  #hello world!  print(match.group(1, 2))  #('hello', 'world')  print(match.groupdict())  #{'sign': '!'}  print(match.start(2))  #6  print(match.end(2))  #11  print(match.span(2))  #(6, 11)  print(match.expand(r'2 13'))  #world hello!    #-------------------- re.search(pattern, string, flags=0) -----------------  """  search对象是一次匹配的结果  属性和方法同re.match(pattern, string, flags=0),它俩的区别:  match()函数只检测RE是不是在string的开始位置匹配,  search()会扫描整个string查找匹配;  也就是说match()只有在0位置匹配成功的话才有返回,  如果不是开始位置匹配成功的话,match()就返回none。  """  s = 'hello world, hellp'  print(re.match('hel', s).span())  #(0, 3)  print(re.match('ell', s))  #None  print(re.search('hel', s).span())  #(0, 3)  print(re.search('ell', s).span())  #(1, 4)    #-------------------- Pattern相关实例方法 -----------------  """  Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。    Pattern不能直接实例化,必须使用re.compile()进行构造。    Pattern提供了几个可读属性用于获取表达式的相关信息:  pattern: 编译时用的表达式字符串。  flags: 编译时用的匹配模式。数字形式。  groups: 表达式中分组的数量。  groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。  """  p = re.compile(r'(w+) (w+)(?P<sign>.*)', re.I)  print(p.pattern)  #(w+) (w+)(?P<sign>.*)  print(p.flags)  #2  print(p.groups)  #3  print(p.groupindex)  #{'sign': 3}    #-------------------- match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]) -----------------  """  match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):  这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。  pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。  注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。  """  s = 'hello world, help'  p = re.compile('hel')  m = p.match(s, 0, 10)  print(m.group())  #hel    m = p.match(s)  print(m.group())  #hel    m = re.match('hel', s)  print(m.group())  #hel  #-------------------- search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]) -----------------  """  2.search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):  这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;  若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。  pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。  """  s = 'hello world, help'  p = re.compile('hel')  m = p.search(s, 0, 10)  print(m.group())    #hel  m = p.search(s)  print(m.group())  #hel    m = re.search('hel', s)  print(m.group())  #hel    #-------------------- split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]) -----------------  """  split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):  按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。  """  p = re.compile(r'd+')  print(p.split('one1two2three3four4'))  #['one', 'two', 'three', 'four', '']    print(p.split('one1two2three3four4', 2))  #['one', 'two', 'three3four4']    print(re.split(r'd+','one1two2three3four4'))  #['one', 'two', 'three', 'four', '']    print(re.split(r'd+', 'one1two2three3four4', 2))  #['one', 'two', 'three3four4']    #-------------------- findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]) -----------------  """  findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):  搜索string,以列表形式返回全部能匹配的子串。re中的findall无法指定字符串搜索起止位置, pattern中的findall无法指定标记类型  """  p = re.compile(r'd+')  print(p.findall('one1two2three3four4'))  #['1', '2', '3', '4']    print(p.findall('one1two2three3four4', 10))  #['3', '4']    print(re.findall(r'd+','one1two2three3four4'))  #['1', '2', '3', '4']    print(re.findall(r'd+', 'one1two2three3four4', re.I))  #['1', '2', '3', '4']    #-------------------- finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]) -----------------  """  finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]):  搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。re中的findall无法指定字符串搜索起止位置, pattern中的findall无法指定标记类型  """  p = re.compile(r'd+')  for m in p.finditer('one1two2three3four4'):      print(m.group())  #1  #2  #3  #4    for m in p.finditer('one1two2three3four4', 0, 10):      print(m.group())  #1  #2    for m in re.finditer(p, 'one1two2three3four4'):      print(m.group())  #1  #2  #3  #4      #-------------------- sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]) -----------------  """  sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):  使用repl替换string中每一个匹配的子串后返回替换后的字符串。  当repl是一个字符串时,可以使用id或g<id>、g<name>引用分组,但不能使用编号0。  当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。  count用于指定最多替换次数,不指定时全部替换。  """  p = re.compile(r'(w+) (w+)')  s = 'i say, hello world!'  m = re.search(p, s)    print(p.sub(r'2 1', s))  #say i, world hello!    def func(x):      return x.group(1).title() + ' ' + x.group(2).title()  print(p.sub(func, s))  #I Say, Hello World!    #-------------------- subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]) -----------------  """  subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):  返回 (sub(repl, string[, count]), 替换次数)  """  p = re.compile(r'(w+) (w+)')  s = 'i say, hello world!'  m = re.search(p, s)    print(p.subn(r'2 1', s))  #('say i, world hello!', 2)    def func(x):      return x.group(1).title() + ' ' + x.group(2).title()  print(p.subn(func, s))  #('I Say, Hello World!', 2)

在网上查阅引用了一些资料,顺带着的练习与总结,新手上路,不足之处多多指正

Exit mobile version