相关文章推荐
买醉的野马  ·  【Python技巧】re.compile有必 ...·  1 月前    · 
月球上的菠菜  ·  python中re.compile()用法详 ...·  1 月前    · 
成熟的枇杷  ·  Python3 re.search()方法·  1 月前    · 
满身肌肉的充值卡  ·  python基础—re模块下的函数及匹配对象 ...·  1 月前    · 
开朗的枕头  ·  精通 Oracle+Python,第 3 ...·  1 月前    · 
大鼻子的书包  ·  【解决】无法将“XXX”项识别为 ...·  2 年前    · 
曾经爱过的冰棍  ·  c语言千分位分隔符-掘金·  2 年前    · 
失眠的番茄  ·  周志华:Learnware ...·  2 年前    · 
火星上的金针菇  ·  cmake学习-阿里云开发者社区·  2 年前    · 
腹黑的槟榔  ·  为了让你们10分钟入门Python,我花5小 ...·  2 年前    · 
Code  ›  python基础—re模块下的函数及匹配对象的属性与方法(re.match()/re.search()...等)
字符串函数 match string 正则表达式
https://blog.csdn.net/sodaloveer/article/details/132411953
满身肌肉的充值卡
1 月前
  • 一、re模块下的函数
    • 1.re.match()
    • 2.re.search()
    • 3.re.fullmatch()
    • 4.re.findall()
    • 5.re.finditer()
    • 6.re.split()
    • 7.re.sub()
    • 8.re.compile()
      • 正则对象的方法和属性
    • 二、re模块下函数的匹配对象

    一、re模块下的函数

    1.re.match()

    re.match() 函数是从头开始匹配一个符合规则的字符串,从 起始位置开始匹配 ,匹配成功返回一个对象,未匹配成功返回None。

    函数语法:

    re.match(pattern,string,flags=0)

    参数说明如下:

    参数 描述
    pattern 匹配正则表达式
    string 要匹配的字符串
    flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    要求:匹配"hello"字符串。

    import re 
    result=re.match("hello","hello world")
    print(result)
    

    输出结果:

    <re.Match object; span=(0, 5), match=‘hello’>

    2.re.search()

    re.search() 函数会在整个字符串内查找匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。

    函数语法:

    re.search(pattern,string,flags=0)

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    string要匹配的字符串
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    要求:匹配出文章阅读的次数。

    import re
    ret = re.search(r"\d+", "阅读次数为 9999")
    print(ret.group())
    

    输出结果:

    3.re.fullmatch()

    re.fullmatch() 函数要求整个字符串完全匹配到正则表达式,就返回一个相应的匹配对象,否则就返回一个None。

    函数语法:

    re.fullmatch(pattern, string, flags=0)

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    string要匹配的字符串
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    要求:匹配出"hello"字符串。

    import re 
    result=re.fullmatch("hello","hello world")
    if result:
    	print(result.group())
    else:
    	print("匹配失败!")
    

    输出结果:

    匹配失败!

    re.match() 、re.search() 和 re.fullmatch()三者区别

    • match()函数只检测RE是不是在string的开始位置匹配
    • search()函数会扫描整个string查找匹配
    • fullmatch()函数会扫描整个string是否完全匹配
    • match()只有在0位置匹配成功才有返回,如果不是开始位置匹配成功的话,match()则返回none。fullmatch()要整个字符串完全匹配上,从0位置开始到结束位置,如果不是,fullmatch()则返回none。
    import re
    print(re.match('super', 'superstition').span())
    print(re.match('super','insuperable'))
    

    输出结果:

    (0, 5)
    None

    import re
    print(re.search('super','superstition').span())
    print(re.search('super','insuperable').span())
    

    输出结果:

    (0, 5)
    (2, 7)

    import re
    print(re.fullmatch('super','superstition').span())
    print(re.fullmatch('super','insuperable').span())
    print(re.fullmatch('super','super').group())
    

    输出结果:

    None
    None
    super

    4.re.findall()

    re.findall() 函数在字符串中找到正则表达式所匹配的所有子串,按顺序返回一个列表,如果没有找到匹配的,则返回空列表。

    函数语法:

    re.findall(pattern,string,flags=0)

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    string要匹配的字符串
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
    • 如果有且仅有一个组,则返回与该组匹配的字符串列表。

    要求:匹配出所有的数字。

    import re
    print(re.findall(r"\d+","abafa 124ddwa56"))
    

    输出结果:

    [‘124’, ‘56’]

    要求:匹配出f开头且左边是空字符串的单词。

    import re
    print(re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest'))
    

    输出结果:

    [‘foot’, ‘fell’, ‘fastest’]

    • 如果有多个组,返回与这些匹配的字符串元组列表。
    import re
    print(re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10'))
    

    输出结果:

    [(‘width’, ‘20’), (‘height’, ‘10’)]

    5.re.finditer()

    re.finditer() 函数在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

    函数语法:

    re.finditer(pattern,string,flags=0)

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    string要匹配的字符串
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    要求:匹配出所有的数字。

    import re
    it = re.finditer(r"\d+", "12a32bc43jf3")
    for match in it:
        print(match.group())
    

    输出结果:

    12
    32
    43
    3

    6.re.split()

    re.split() 函数按照能够匹配子串将字符串分割后返回列表。

    函数语法:

    re.split(pattern, string[, maxsplit=0, flags=0])

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    string要匹配的字符串
    maxsplit分隔次数,maxsplit=1分隔一次,默认为0,不限制次数。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    用pattern分隔开string。

    要求:用非a-zA-Z0-9_字符切分字符串。

    import re 
    re.split(r'\W+','Words, words, words.')
    

    输出结果:

    [‘Words’, ‘words’, ‘words’, ‘’]

    • 如果maxsplit非零,最多进行maxsplit分隔,剩下的字符全部返回到列表的最后一个元素。

    要求:用非a-zA-Z0-9_字符切分字符串且只分隔一次。

    re.split(r'\W+', 'Words, words, words.', 1)
    

    输出结果:

    [‘Words’, ‘words, words.’]

    • 如果pattern中捕获到括号,那么所有的组里的文字也会包含在列表里。
    re.split(r'(\W+)', 'Words, words, words.')
    

    输出结果:

    [‘Words’, ', ', ‘words’, ', ', ‘words’, ‘.’, ‘’]

    • 如果分隔符里有捕获组合,并且在匹配字符串的开始,那么结果将会以一个空字符串开始,对于结尾也是一样。
    re.split(r'(\W+)', '...words, words...')
    

    输出结果:

    [‘’, ‘…’, ‘words’, ', ', ‘words’, ‘…’, ‘’]

    • 用正则表达式切分字符串比用固定的字符更灵活。

    正常的切分代码:

    'a b   c'.split(' ')
    

    输出结果:

    [‘a’, ‘b’, ‘’, ‘’, ‘c’]

    无法识别连续的空格,用正则表达式试试:

    import re 
    print(re.split(r'\s+','a b   c'))
    #无论多少个空格都可以正常分割。加入,
    print(re.split(r'[\s\,]+', 'a,b, c  d'))
    #再加入;
    print(re.split(r'[\s\,\;]+', 'a,b;; c  d'))
    

    输出结果:

    [‘a’, ‘b’, ‘c’]
    [‘a’, ‘b’, ‘c’, ‘d’]
    [‘a’, ‘b’, ‘c’, ‘d’]

    7.re.sub()

    re.sub() 函数用于替换字符串中的匹配项。

    函数语法:

    re.sub(pattern, repl, string, count=0, flags=0)

    参数说明如下:

    参数描述
    pattern匹配正则表达式
    repl替换的字符串,也可以是一个函数。
    string要被查找替换的原始字符串。
    count模式匹配后替换的最大次数,默认0表示替换所有的匹配。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

    前三个必选参数,后两个为可选参数。

    要求:删除注释,移除非数字的内容。

    import re
    phone = "2004-959-559 # 这是一个电话号码"
    # 删除注释
    num = re.sub(r'#.*$', "", phone)
    print("电话号码 : ", num)
    # 移除非数字的内容
    num = re.sub(r'\D', "", phone)
    print("电话号码 : ", num)
    

    输出结果:

    电话号码 : 2004-959-559
    电话号码 : 2004959559

    • repl参数可以是一个函数,正则表达式使用了 (?P…) 语法,将匹配到的数字部分的字符串命名为value。

    要求:将匹配的数字乘于 2。

    import re
    # 将匹配的数字乘于 2
    def double(matched):
        value = int(matched.group('value'))
        return str(value * 2)
    s = 'A23G4HFD567'
    print(re.sub('(?P<value>\d+)', double, s))
    

    输出结果:

    A46G8HFD1134

    8.re.compile()

    re.compile() 函数将正则表达式的样式编译为一个正则表达对象(正则对象),可以用于匹配,通过这个对象的方法match(),search()以及其他。

    这个表达式的行为可以通过指定标记的值来改变,值可以是以下任意变量。

    prog=re.compile(pattern)
    result=prog.match(string)
    
    result=re.match(pattern,string)
    

    如果需要多次使用这个正则表达式的话,使用re.compile()和保存这个正则对象以便利用,可以让程序更加高效。

    正则对象的方法和属性

    用compile编译后的正则表达式对象支持以下方法和属性:

    • pattern.search(string[, pos[, endpos]])
      扫描整个string寻找第一个匹配的位置,并返回一个相应的匹配对象。如果没有匹配,就返回None。

      pos参数可以选择字符串开始搜索的位置索引,默认为0,它不完全等价于字符串切片,'^'样式字符匹配字符串真正的开关,和换行符后面的第一个字符,但不会匹配索引 规定开始的位置。

      可选的参数endpos限定了字符串搜索的结束,它假定字符串长度到endpos,所以只有从pos到endpos-1的字符会被匹配,如果endpos小于pos,就不会有匹配产生,另个,如果rx是一个编译后的正则对象,rx.search(string,0,50) 等价于rx.search(string[:50],0)。

    import re 
    pattern=re.compile("o")
    print(pattern.search("dog"))
    print(pattern.search("dog",2))
    

    输出结果:

    <re.Match object; span=(1, 2), match=‘o’>
    None

    • pattern.match(string[, pos[, endpos]])
      如果 string 的 开始位置 能够找到这个正则样式的任意个匹配,就返回一个相应的 匹配对象。如果不匹配,就返回 None。

      pos参数可以选择字符串开始搜索的位置索引,默认为0,它不完全等价于字符串切片,'^'样式字符匹配字符串真正的开关,和换行符后面的第一个字符,但不会匹配索引 规定开始的位置。

    import re 
    pattern=re.compile("o")
    print(pattern.match("dog"))
    print(pattern.match("dog",1))
    

    输出结果:

    None
    <re.Match object; span=(1, 2), match=‘o’>

    • pattern.fullmatch()
      如果整个string匹配这个正则表达式,就返回一个相应的匹配对象。否则就返回None。

      可选参数 pos 和 endpos 与 search() 含义相同。

    import re 
    pattern=re.compile("o[gh]")
    print(pattern.fullmatch("dog"))
    print(pattern.fullmatch("ogre"))
    print(pattern.fullmatch("doggie",1,3))
    

    输出结果:

    None
    None
    <re.Match object; span=(1, 3), match=‘og’>

    • pattern.findall(string[, pos[, endpos]])
      类似函数 findall() , 使用了编译后样式,但也可以接收可选参数 pos 和 endpos ,限制搜索范围,就像 search()。

    • pattren.finditer(string[, pos[, endpos]])
      类似函数 finditer() , 使用了编译后样式,但也可以接收可选参数 pos 和 endpos ,限制搜索范围,就像 search()。

    • pattern.split(string, maxsplit=0)
      等价于 split() 函数,使用了编译后的样式。

    • pattern.sub(repl, string, count=0)
      等价于 sub() 函数,使用了编译后的样式。

    二、re模块下函数的匹配对象

    正则表达式的函数一旦匹配成功,就是object对象,匹配对象支持以下方法和属性:

    group() 返回被 RE 匹配的字符串

    • 如果只有一个参数,结果就是一个字符串,如果没有参数,默认为0,相应的返回值就是整个匹配字符串。
    m=re.match(r"(\w+) (\w+)", "I love you, Tom")
    m.group()
    m.group(0)
    

    输出结果:

    ‘I love’

    • 如果它是一个范围[1…99],结果就是相应的括号组字符串。
    m.group(1)
    m.group(2)
    

    输出结果:

    ‘I’
    ‘love’

    • 如果有多个参数,结果就是一个元组,第个参数对应一个。
    m.group(1,2)
    

    输出结果:

    (‘I’, ‘love’)

    • 如果正则表达式使用了(?P…) 语法, groupN 参数就也可能是命名组合的名字。如果一个字符串参数在样式中未定义为组合名,就引发一个 IndexError 异常。
    import re
    m=re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
    print(m.group("first_name"))
    print(m.group("last_name"))
    

    输出结果:

    Malcolm
    Reynolds

    • 命名组合同样可以通过索引值引用
    print(m.group(1))
    print(m.group(2))
    

    输出结果:

    Malcolm
    Reynolds

    • 3.6版本后可以直接Match.getitem(g),等价于m.group(g)。
    print(m[1])
    print(m[2])
    
    print(m['first_name'])
    print(m['last_name'])
    

    输出结果:

    Malcolm
    Reynolds

    start() 返回匹配开始的位置
    end() 返回匹配结束的位置
    span() 返回一个元组包含匹配 (开始,结束) 的位置

    import re 
    result=re.match("hello","hello world")
    print(result.start())
    print(result.end())
    print(result.span())
    

    输出结果:

    0
    5
    (0, 5)

    匹配对象总是有一个布尔值 True。 所以可以简单的用 if 语句来判断是否匹配

    import re 
    result=re.match("hello","hello world")
    if result:
    	print(result.group())
    else:
    	print("匹配失败!")
    

    输出结果:

    hello

    参考文章:
    https://docs.python.org/zh-cn/3/library/re.html#functions
    https://www.cnblogs.com/CYHISTW/p/11363209.html
    https://blog.csdn.net/weixin_38819889/article/details/93846579
    https://blog.csdn.net/sodaloveer/article/details/128444428?spm=1001.2014.3001.5501

     今天学习了Python中有关正则表达式的知识。关于正则表达式的语法,不作过多解释,网上有许多学习的资料。这里主要介绍Python中常用的正则表达式处理函数。 re.match   re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。 1. import re 3. text = "JGood is a handsom...
    详解python正则表达式之re.match()与re.search()的用法,re.match()方法要求必须从字符串的开头进行匹配,如果字符串开头不符合模式规则,整个匹配就失败了,函数返回None; re.search()并不要求必须从字符串的开头进行匹配,而是扫描整个字符串,直到找到第一个匹配。...
 
推荐文章
买醉的野马  ·  【Python技巧】re.compile有必要吗?_python pattern必须compile吗
1 月前
月球上的菠菜  ·  python中re.compile()用法详解_pythonrecompile
1 月前
成熟的枇杷  ·  Python3 re.search()方法
1 月前
满身肌肉的充值卡  ·  python基础—re模块下的函数及匹配对象的属性与方法(re.match()/re.search()...等)
1 月前
开朗的枕头  ·  精通 Oracle+Python,第 3 部分:数据解析
1 月前
大鼻子的书包  ·  【解决】无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次_无法将npc.exe识别为脚本文件_weixin_41362657的博客-CSDN博客
2 年前
曾经爱过的冰棍  ·  c语言千分位分隔符-掘金
2 年前
失眠的番茄  ·  周志华:Learnware 将是机器学习的未来-腾讯云开发者社区-腾讯云
2 年前
火星上的金针菇  ·  cmake学习-阿里云开发者社区
2 年前
腹黑的槟榔  ·  为了让你们10分钟入门Python,我花5小时写了7个案例和这篇文章!!! - 乐却思蜀 - 博客园
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号