• 正则表达式


    正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    在正则表达式中,

    若直接给出字符,就是精确匹配。

    d    匹配一个数字,如 ‘00d’     可匹配 ‘004’ 而不能匹配 ‘00a’

    w    匹配一个数字或字母 如 ‘wwd’    可匹配 ‘fg5’

    .      可匹配任一字符,如 ‘py.’ 可匹配 ‘pyd’、‘py7’、‘py!’等

    匹配变长字符,

    * 表示任意个字符(含0个)

    + 表示至少一个字符

    ?表示0个或1个字符

    {n}表示n个字符,{n,m}表示n到m个字符。

      例:d{3}s+d{3,8}  d{3}表示匹配3个数字;s表示匹配一个空格(含Tab等空白符),因此s+表示至少有一个空格;d{3,8}表示3-8个数字。若要匹配‘010-12345’,因为‘-’是特殊字符,在正则表达式中要用‘’转义,即d{3}-d{3,8}。但是,仍然无法匹配‘010 - 12345’,因为带有空格。需要更复杂的匹配方式。

    [ ]表示范围:

    [0-9a-zA-Z\_]          可匹配一个数字、字母或下划线

    [0-9a-zA-Z\_]+           可匹配至少由一个数字、字母或下划线组成的字符串

    [a-zA-Z\_] [0-9a-zA-Z\_]*        可匹配python的合法变量,即字母或下划线开头,后接任意个由字母、数字或下划线组成的字符串

    [a-zA-Z\_] [0-9a-zA-Z\_] {0,19}  更精确限制了变量长度为1+{0,19}

    A|B    可匹配A或B

    ^      表示行的开头,^d表示必须以数字开头

    $     表示行的结束,d$表示必须以数字结束

    re模块

     注意:python中字符串也用 转义,python字符串前建议加 r 

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

    Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.

    In [312]: re.match('d{3}-d{3,8}','111-123')
    Out[312]: <_sre.SRE_Match object; span=(0, 7), match='111-123'>
    
    In [313]: re.match('d{3}-d{3,8}','111-123')
    Out[313]: <_sre.SRE_Match object; span=(0, 7), match='111-123'>    #可见-和-都能匹配字符串中的-
    
     
    
    In [324]: re.match('100','100')
    Out[324]: <_sre.SRE_Match object; span=(0, 1), match='@'>
    
    In [325]: re.match('\100','100')
    Out[325]: <_sre.SRE_Match object; span=(0, 1), match='@'>
    
    In [326]: re.match('\100','100')                     #只能三个\
    Out[326]: <_sre.SRE_Match object; span=(0, 1), match='@'>
    View Code

    切分字符串:

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

    返回切分后列表

    In [348]: re.split(r'[s\,]+','a,b c  d')
    Out[348]: ['a', 'b', 'c', 'd']

    分组:

    提取子串,用()表示的就是要提取的分组(Group)。如^(d{3})-(d{3,8})$分别定义了两个组,可从匹配的字符串中提取区号和本地号码:

    In [27]: import re
    
    In [28]: m = re.match(r'^(d{3})-(d{3,8})$','010-12345')
    
    In [29]: m
    Out[29]: <_sre.SRE_Match object; span=(0, 9), match='010-12345'>
    
    In [30]: m.group(0)      #如果正则表达式中定义了组,可在match对象中用group()提取子串,参数无或0返回原始字符串,1、2、...表示第i个子串
    Out[30]: '010-12345'      #也可用groups()提取所有子串构成的元组
    
    In [31]: m.group(1)
    Out[31]: '010'
    
    In [32]: m.group(2)
    Out[32]: '12345'
    
    In [33]: m.group(3)
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-33-71a2c7935517> in <module>()
    ----> 1 m.group(3)
    
    IndexError: no such group

    贪婪匹配:

    正则匹配默认是贪婪匹配,即匹配尽可能多的字符

    In [53]: re.match(r'^(d+)(0*)$','102300').groups()
    Out[53]: ('102300', '')
    
    In [54]: re.match(r'^(d+?)(0*)$','102300').groups()
    Out[54]: ('1023', '00')

     

    渐变 --> 突变
  • 相关阅读:
    Python 多线程学习(转)
    自己使用python webob,paste.deploy,wsgi总结
    Python中*args 和**kwargs的用法
    python 数字和字符串转换问题
    python socket编程
    深入解读Quartz的原理
    解决get方法传递URL参数中文乱码和解决tomcat下中文乱码问题
    Tomcat的Manager显示403 Access Denied
    mysql5.6 linux下安装笔记
    Quartz应用与集群原理分析
  • 原文地址:https://www.cnblogs.com/lybpy/p/7806911.html
Copyright © 2020-2023  润新知