美文网首页
python14--re模块(正则表达式)

python14--re模块(正则表达式)

作者: minisummer | 来源:发表于2020-08-04 22:59 被阅读0次

    哈喽,大家好!我是minisummer!首先感谢您的关注!
    今天给大家分享的内容是python标准库-re模块。

    在讲re模块之前,首先我们需要知道正则表达式的基本语法。

    正则表达式

    正则表达式是一个特殊的字符序列,能方便的检查一个字符串是否与某种模式匹配。re模块使得python拥有全部的正则表达式功能。
    正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
    正则表达式在线工具:http://tool.chinaz.com/regex/

    正则表达式作用

    1.做数据校验;
    2.替换文本;
    3.提取子字符串;
    4.查找特定文本。

    正则表达式特殊字符

    . 匹配除换行符\n之外的任何单字符
    ? 匹配0或1个字符(非贪婪限定符)
    * 匹配0或多个字符(贪婪限定符)
    + 匹配1或多个(贪婪限定符)
    ^ 匹配输入字符串的开始位置
    $ 匹配输入字符串的结束位置
    [] 匹配包含在中括号中的任意字符
    [^] 匹配包含在中括号中的字符之外的字符
    [-] 匹配指定范围的任意单个字符
    { 标记限定符表达式的开始
    \ 将下一个字符标记特殊字符或原义字符
    | 指明两项之间的一个选择
    () 标记一个子表达式的开始和结束位置

    正则表达式限定符

    . 匹配除换行符\n之外的任何单字符
    + 匹配0或多个字符(贪婪限定符)
    ? = {0,1}匹配0或1个字符(非贪婪限定符)
    {n} 确定匹配n次
    {n,} 至少匹配n次
    {n,m} 最少匹配n次且最多匹配m次

    正则表达式字符簇

    [[:alpha:]] 任何字母
    [[:digit:]] 任何数字
    [[:alnum:]] 任何字母和数字
    [[:space:]] 任何空白字符
    [[:upper:]] 任何大写字母
    [[:lower:]] 任何小写字母
    [[:punct:]] 任何标点符号
    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

    常用的正则表达式

    [a-z] #匹配所有的小写字母
    [A-Z] #匹配所有的大写字母
    [a-zA-Z] #匹配所有的字母
    [0-9] #匹配所有的数字
    [0-9.-] #匹配所有的数字,句号和减号
    [ \f\r\t\n] #匹配所有的白字符
    [^a-z] #除了小写字母以外的所有字符
    [^\/^] #除了()(/)(^)之外的所有字符
    [^"'] #除了双引号(")和单引号(')之外的所有字符
    ^[a-zA-Z_]#所有的字母和下划线 ^[[:alpha:]]{3} #所有的3个字母的单词
    ^a#字母a ^a{4} #aaaa
    ^a{2,4}#aa,aaa或aaaa ^a{1,3} #a,aa或aaa
    ^a{2,}#包含多于两个a的字符串 ^[a-zA-Z0-9_]{1,} # 所有包含一个以上的字母、数字或下划线的字符串
    ^[1-9][0-9]{0,}# 所有的正整数 ^\-{0,1}[0-9]{1,} # 所有的整数
    ^[-]?[0-9]+.?[0-9]+$ # 所有的浮点数

    re模块

    import re
    
    re_str = "hello this is python 2.7.13 and python 3.4.5"
    pattern1 = "python [0-9]\.[0-9]\.[0-9]"
    res1 = re.findall(pattern=pattern1,string=re_str)
    print(res1) #['python 2.7.1', 'python 3.4.5']
    
    pattern2 = "python [0-9]\.[0-9]\.[0-9]{2,}"
    res2 = re.findall(pattern=pattern2,string=re_str)
    print(res2) #['python 2.7.13']
    
    # findall()方法:返回一个列表,如果匹配到的话,列表中的元素为匹配到的子字符串,如果没有匹配到,则返回一个空的列表
    pattern3 = "python[0-9]\.[0-9]\.[0-9]{2,}"
    res3 = re.findall(pattern=pattern3,string=re_str)
    print(res3) #[]
    
    
    re_str = "hello this is python 2.7.13 and Python 3.4.5"
    pattern4 = "python [0-9]\.[0-9]\.[0-9]"
    # 设置标志flags=re.IGNORECASE,意思为忽略大小写
    res4 = re.findall(pattern=pattern4, string=re_str, flags=re.IGNORECASE)
    print(res4) # ['python 2.7.1', 'Python 3.4.5']
    
    
    # 一般采用编译的方式使用python的正则模块,如果在大量的数据量中,编译的方式使用正则性能会提高很多
    re_str = "hello this is python 2.7.13 and Python 3.4.5"
    re_obj = re.compile(pattern = "python [0-9]\.[0-9]\.[0-9]",flags=re.IGNORECASE)
    res = re_obj.findall(re_str)
    print(res) #['python 2.7.1', 'Python 3.4.5']
    
    
    # match方法,类似于字符串中的startwith方法,只是match应用在正则表达式中更加强大,更富有表现力,match函数用以匹配字符串的开始部分,如果模式
    # 匹配成功,返回一个SRE_Match类型的对象,如果模式匹配失败,则返回一个None,因此对于普通的前缀匹配,他的用法几乎和startwith一模一样,例如我们要判断data字符串是否以what和是否以数字开头
    s_true = "what is a boy"
    s_false = "What is a boy"
    re_obj = re.compile("what")
    print(re_obj.match(string=s_true))  #<re.Match object; span=(0, 4), match='what'>
    print(re_obj.match(string=s_false)) #None
    
    
    # search方法,模式匹配成功后,也会返回一个SRE_Match对象,search方法和match的方法区别在于match只能从头开始匹配,而search可以从
    # 字符串的任意位置开始匹配,他们的共同点是,如果匹配成功,返回一个SRE_Match对象,如果匹配失败,返回一个None,这里还要注意,
    # search仅仅查找第一次匹配,也就是说一个字符串中包含多个模式的匹配,也只会返回第一个匹配的结果,如果要返回所有的结果,最简单的方法就是findall方法,也可以使用finditer方法
    
    
    # finditer返回一个迭代器,遍历迭代器可以得到一个SRE_Match对象
    re_str = "what is a different between python 2.7.14 and python 3.5.4"
    re_obj = re.compile("\d{1,}\.\d{1,}\.\d{1,}")
    for i in re_obj.finditer(re_str):
        print(i) #<re.Match object; span=(35, 41), match='2.7.14'> ; <re.Match object; span=(53, 58), match='3.5.4'>
    
    # re模块sub方法类似于字符串中的replace方法,只是sub方法支持使用正则表达式,所以,re模块的sub方法使用场景更加广泛
    re_str = "what is a different between python 2.7.14 and python 3.5.4"
    re_obj = re.compile("\d{1,}\.\d{1,}\.\d{1,}")
    print(re_obj.sub("a.b.c", re_str, count=1)) #what is a different between python a.b.c and python 3.5.4
    print(re_obj.sub("a.b.c",re_str,count=2))#what is a different between python a.b.c and python a.b.c
    print(re_obj.sub("a.b.c",re_str))#what is a different between python a.b.c and python a.b.c
    
    
    # re模块的split方法和python字符串中的split方法功能是一样的,都是将一个字符串拆分成子字符串的列表,区别在于re模块的split方法能够
    re_str = "what is a different between python 2.7.14 and python 3.5.4 USA:NewYork!Zidan.FRA"
    # 使用. 空格 : !分割字符串,返回的是一个列表
    re_obj = re.compile("[. :!]")
    print(re_obj.split(re_str)) #['what', 'is', 'a', 'different', 'between', 'python', '2', '7', '14', 'and', 'python', '3', '5', '4', 'USA', 'NewYork', 'Zidan', 'FRA']
    
    # 大小写不敏感设置
    # re.compile(flags=re.IGNORECASE)
    
    
    # 非贪婪匹配
    s = "Beautiful is better than ugly.Explicit is better than impliciy."
    re_obj = re.compile("Beautiful.*y\.")
    print(re_obj.findall(s))#['Beautiful is better than ugly.Explicit is better than impliciy.']
    re_obj = re.compile("Beautiful.*?\.")
    print(re_obj.findall(s)) #['Beautiful is better than ugly.']
    
    s = "=aa1239d&&& 0a ()--"
    rep = re.compile("\w+(&+)")
    print(rep.findall(s))# ['&&&']
    print(rep.search(s).group())# aa1239d&&&
    print(rep.search(s).group(1))# &&&
    
    

    参考文章:https://www.cnblogs.com/bainianminguo/p/10657631.html

    请大家多多指教~
    以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。
    注:转载请注明出处,商用请征得作者本人同意,谢谢!!!

    相关文章

      网友评论

          本文标题:python14--re模块(正则表达式)

          本文链接:https://www.haomeiwen.com/subject/vjgvqktx.html