zoukankan      html  css  js  c++  java
  • 正则

    正则表达式,又称正规表示式,是计算机科学的一个概念。匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索,替换那些匹配某个模式的文本。在开发中会大量的字符串处理工作,其中经常会涉及带字符串格式的校验,比如网页中的注册表单。使用正则表达式会非常方便,例如:检测输入QQ号,E-mail地址,手机号等等。

    match:

    匹配。左边第一个开始算起,匹配到返回匹配对象,否则返回None(注意不是空字符串),group方法用来取值。

    #!/urs/bin/evn python
    # -*- coding:utf-8 -*-
    import re
    
    print(re.match("abc", "abc"))  # 匹配。左边第一个开始算起
    print(re.match("Xabc", "abc"))  # 匹配不成功None 匹配成功返回位置详细信息
    print(re.match("abc", "Xabc"))
    print(re.match("abc", "abcX"))
    
    # match 严格匹配。从一个一个开始
    matchobj = re.match("abc", "abcdefgag")
    print(matchobj)
    print(type(matchobj))
    print(matchobj.group(0))  # 挖掘的第一个匹配
    
    line = "xqxzq is a boy not a gril"
    matchobj = re.match(r"(.*) is (.*)", line)
    print(matchobj)  # 详细匹配
    print(matchobj.group(0))
    print(matchobj.group(1))
    print(matchobj.group(2))
    
    结果:
    
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    None
    None
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    <class '_sre.SRE_Match'>
    abc
    <_sre.SRE_Match object; span=(0, 25), match='xqxzq is a boy not a gril'>
    xqxzq is a boy not a gril
    xqxzq
    a boy not a gril
    View Code
    search

    search(pattern, string, flags=0)
    string:匹配的正则表达式
    pattern:要匹配的字符串
    flags:标志位,用于控制正则表达式的匹配方式
    功能:整个字符串,并返回第一个成功的匹配的对象,否则返回None。


    #!/urs/bin/evn python
    # -*- coding:utf-8 -*-
    import re
    
    print(re.match("abc", "abcxyz"))
    print(re.match("xyz", "abc xyz"))  # 匹配从第一个开始
    
    print(re.search("abc", "abcxyz"))
    print(re.search("xyz", "abc xyz"))  # 包含就可以
    
    searchobj = re.search("abc", "abc xyz")
    print(searchobj)
    print(searchobj.group())
    print(searchobj.group(0))
    
    searchobj = re.search(r"(.*)-is-(.*)", "abc xyz-is-go")
    print(searchobj)
    print(searchobj.group())
    print(searchobj.group(0))
    print(searchobj.group(1))
    print(searchobj.group(2))
    
    
    结果:
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    None
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    <_sre.SRE_Match object; span=(4, 7), match='xyz'>
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    abc
    abc
    <_sre.SRE_Match object; span=(0, 13), match='abc xyz-is-go'>
    abc xyz-is-go
    abc xyz-is-go
    abc xyz
    go
    View Code
    findall

    findall(pattern, string, flags=0)
    string:匹配的正则表达式
    pattern:要匹配的字符串
    flags:标志位,用于控制正则表达式的匹配方式
    功能:整个字符串,并返回结果列表
    (finditer()函数相似 )


    QQstr = "498235786@qq.com"
    
    searchobj = re.findall("[1-9]d{4,10}", QQstr)
    print(searchobj)  # 搜索全部
    View Code

    sub与subn  替换

    import  re
    """
    safestr="全能神  全能神 全能神 全能神"
    #safestr=re.subn("全能神","宇宙真理",safestr) #替换
    safestr=re.subn("全能神","",safestr) #删除
    print(safestr)
    print(safestr[0])
    print(safestr[1])
    """
    safestr="132  21323 213 213 213"
    safestrlast=re.subn("\d+", "ABC", safestr) #删除
    print(safestrlast)
    print(safestr[0])
    print(safestr[1])  # 全部替换
    print("*"*50)
    safestr="132  21323 213 213 213"
    safestrlast=re.sub("\d+","ABC",safestr) #删除
    print(safestrlast)
    
    结果;
    ('ABC  ABC ABC ABC ABC', 5)
    1
    3
    **************************************************
    ABC  ABC ABC ABC ABC
    View Code

    split:

    split根据匹配进行切割字符串,并返回一个列表
    # -*-coding:utf-8 -*-
    import re
    """
    字符串切割
    line="363316626-----3633166268190x10"
    linelist=line.split("-----")
    print(linelist)
    """
    line="1277403 1小姐    22   166 本科 合肥    双鱼座    普通话"
    mylist=re.split("\s+",line)
    print(mylist)
    line1="a,b c: d; "
    li=re.split(r"[\s\,:;]",line1)
    print(li)
    
    结果:
    ['1277403', '1小姐', '22', '166', '本科', '合肥', '双鱼座', '普通话']
    ['a', 'b c', ' d', ' ']
    View Code
    匹配分组:
    | 匹配左右任意一个表达式
    (ab) 将括号中字符作为一个分组
    um 引用分组num匹配到的字符串
    (?P<name>) 分组起别名
    (?P=name) 引用别名为name分组匹配到的字符串


    表示边界
    ^ 匹配字符串开头
    $ 匹配字符串结尾
     匹配一个单词的边界
    B 匹配非单词边界
    [] 匹配任意一个



    表示数量
    . 匹配前一个字符出现0次或者无限次,即可有可无
    + 匹配前一个字符出现1次或者无限次,即至少有1次
    ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    {m} 匹配前一个字符出现m次
    {m,} 匹配前一个字符至少出现m次
    {m,n} 匹配前一个字符出现从m到n次


    # 一元字符 (. ^ $ + ? {} | ())


    d 匹配任何数字,它相当于[0-9]
    D 匹配任何非数字字符,它相当于[^0-9]
    s 匹配任何空白字符,它相当于[ fv]
    S 匹配任何非空白字符,它相当于[^ fv]
    w 匹配任何字母数字字符,它相当于[a-zA-Z0-9]
    w 匹配任何非字母数字字符,它相当于[^a-zA-Z0-9]
     匹配到一个单词边界,也就是指单词和空格间的位置



    re.I 匹配对大小不敏感,忽略异常
    re.L 做本地化匹配
    re.M 多行匹配,影响^ 和 $
    re.S 使.匹配包过换行在内的所有字符
    re.U 根据Unicde字符解析字符,这个标志影响w, W, 
    re.X
    常见的匹配:

    #!/urs/bin/evn python
    # -*- coding:utf-8 -*-
    import re
    Emailstr = "462928483@qq.com"
    Emai=re.compile("([A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4})", re.IGNORECASE)
    searchobj= re.findall(Emai, Emailstr)
    print(searchobj)
    
    
    
    searchobj1 = re.findall("1[34578]\d{9}", "13623413412")
    print(searchobj1)
    
    
    busstr= re.sub(r"php", "python", "itcast python php python php")
    print(busstr)
    
    busstr1= re.sub(r"d+", "50", "python=1000 php=50")
    print(busstr1)
    
    # sub将匹配到的数据进行替换
    
    ret = re.search(r"d+", "阅读次数为 9999")
    print(ret.group())
    
    
    p = r"(w+)@(163|126|gmail|qq).(com|cn|net)$"
    r = re.match(p, Emailstr)
    print(r.group())
    
    s = "<html><h1>百度一下</h1></html>"
    re.match(r"(<.+><.+>.+</.+></.+>)", s)
    print(s)
    
    
    
    结果:
    ['462928483@qq.com']
    ['13623413412']
    itcast python python python python
    python=50 php=50
    9999
    462928483@qq.com
    <html><h1>百度一下</h1></html>
    View Code
    import re
    
    m = re.search(r"^0[1-9](d{1,2})-[1-9](d{6,7})$", "0571-1234567")
    if m is not None:
        print(m.group())
    else:
        print(None)
    
    
    结果:
    0571-1234567
    View Code
    import re
    
    m = re.search(r"((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))", "127.0.0.1")
    if m is not None:
        print(m.group())
    else:
        print(None)
    
    结果
    
    127.0.0.1
    View Code
    import re
    
    m = re.search(r"^((((19|20)d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]d|30))|(((19|20)d{2})-(0?[13578]|1[02])-31)|(((19|20)d{2})-0?2-(0?[1-9]|1d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$", "1985-05-22")
    if m is not None:
        print(m.group())
    else:
        print(None)
    import re
    
    m = re.search(r"(^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$)|(^[1-9]d{5}d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{2}[0-9Xx]$)", "")
    if m is not None:
        print(m.group())
    else:
        print(None)
    
    
    
    十八位:^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$
    
    十五位:^[1-9]d{5}d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{2}[0-9Xx]$
    View Code
    正则表达式:
    出生日期1800-2099 (18|19|20)?d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])
    身份证正则表达式 /^d{6}(18|19|20)?d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])d{3}(d|[xX])$/
    位校验规则 6位地址编码+8位出生日期+3位顺序号+1位校验位



  • 相关阅读:
    转发URL请求
    服务端使用Zookeeper注册服务地址,客户端从Zookeeper获取可用的服务地址。
    Boss Group Worker Group NioEventLoopGroup
    Java NIO vs. IO
    解决了网关所面临的依赖于后端接口服务的上线问题
    Dealing with a Stream-based Transport 处理一个基于流的传输 粘包 即使关闭nagle算法,也不能解决粘包问题
    use Properties objects to maintain its configuration Writing Reading System Properties 维护配置 系统变量
    即使关闭了nagle算法,粘包依旧存在
    解Bug之路-TCP粘包Bug
    Netty 粘包/半包原理与拆包实战
  • 原文地址:https://www.cnblogs.com/zqxqx/p/9308631.html
Copyright © 2011-2022 走看看