IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]3.2.2 正则表达式的功能

    caimouse发表于 2015-08-09 07:56:23
    love 0

    在本模块内主要包括函数、常量和异常。有一些函数是为简单使用,而减少一些特征。在大多数的正规的应用程序里,都是采用编译方式来使用正则表达式。

     

    re.compile(pattern, flags=0)

    编译一个正则表达式,并生成一个正则表达式对象,而这个对象可以使用方法match()和search()来进行匹配。编译正则表达式的选项,可以通过flags来设置,这些参数可以通过或(|)的方式来进行组合。

    这个编译过程如下:

    prog = re.compile(pattern)

    result = prog.match(string)

    与下面处理过程相同:

    result = re.match(pattern, string)

    不过,re.compile()的方式在多次重复使用这个正则表达式时是有很大优势,因为会大大减少正则表达式的重复编译过程。值得注意是:最新版本的Python会把re.compile()最近几次编译的对象缓存起来,如果只是使用很少正则表达式,不用担心重复编译的问题。

    例子:

    print('re.compile');

    prog = re.compile(r'cai\d')

    result = prog.match(r'cai7 caimouse cai cai8')

    if result:

        print(result.group(0))

    输出结果如下:

    re.compile

    cai7

     

    re.A

    re.ASCII

    指定\w,\W,\b,\B,\d,\D,\s和\S使用ASCII模式之下,而不使用在UNICODE的模式。不过它只有UNICODE里使用,而在8位的模式之下忽略这个标志。为了兼容以前版本的正则表达式,re.U标志还在使用,由于在Python3.0以后都默认使用UNICODE的方式,所以re.U是多余的。

    例子:

    print('re.A, re.ASCII')

    prog = re.compile('深圳软件中心\\d+', re.A)

    result = prog.match('深圳软件中心007 用软件改变世界98')

    if result:

        print(result.group(0))

    输出结果如下:

    re.A, re.ASCII

    深圳软件中心007

     

    re.DEBUG

    详细显示编译正则表达式的信息。

    例子:

    print('re.DEBUG')

    prog = re.compile('深圳软件中心\\d+', re.DEBUG)

    result = prog.match('深圳软件中心007 用软件改变世界98')

    if result:

        print(result.group(0))

    输出结果如下:

    re.DEBUG

    literal 28145

    literal 22323

    literal 36719

    literal 20214

    literal 20013

    literal 24515

    max_repeat 1 2147483647

      in

        category category_digit

    深圳软件中心007

     

    re.I

    re.IGNORECASE

    忽略大小写字母区别。会把[A-Z]集合字符转换为小写字母再来匹配。如果UNICODE的字母是不受影响的。

    例子:

    print('re.I, re.IGNORECASE')

    prog = re.compile('myCar\\d+', re.IGNORECASE)

    result = prog.match('mycar007 用软件改变世界98')

    if result:

        print(result.group(0))   

    结果输出如下:

    re.I, re.IGNORECASE

    mycar007

     

    re.L

    re.LOCALE

    让\w,\W,\b,\B,\s和\S依赖不同本地系统而改变定义范围。由于不同系统差异,导致使用这个特性会比较不可靠,推荐使用UNICODE的方式来消除这方面的差异。

    例子:

    print('re.L, re.LOCALE')

    prog = re.compile('myCar\\d+', re.I|re.L)

    result = prog.match('mycar007 用软件改变世界98')

    if result:

        print(result.group(0))   

    结果输出如下:

    re.L, re.LOCALE

    mycar007

     

    re.M

    re.MULTILINE

    指定多行模式匹配。当指定为此标志时,‘^’表示匹配字符串开头和所有换行符后面的字符串的开头。同样‘$’表示字符串结尾和所有换行符前的结尾。

    例子:

    print('re.M, re.MULTILINE')

    result = re.findall('^mycar','mycar007 \nmycar008\n', re.M)

    if result:

        print(result) 

    result = re.findall('^mycar','mycar007 \nmycar008\n')

    if result:

        print(result)   

    结果输出如下:

    re.M, re.MULTILINE

    ['mycar', 'mycar']

    ['mycar']

     

    re.S

    re.DOTALL

    点号‘.’是否表示换行符的标志。当设置时,包括表示换行符,否则不包括。

    例子:

    print('re.S, re.DOTALL')

    result = re.findall('mycar\d+.','mycar007\nmycar008\n', re.S)

    if result:

        print(result) 

    result = re.findall('mycar\d+.','mycar007\nmycar008\n')

    if result:

        print(result) 

    结果输出如下:

    re.S, re.DOTALL

    ['mycar007\n', 'mycar008\n']

    ['mycar007', 'mycar008']

     

    re.X

    re.VERBOSE

    这个标志主要用来给正则表达式进行排版和注释使用。当有这个标志时,正则表达式中的换行符会忽略,#号当作注释的开始。这样方式可以提高正则表达式的阅读性,但功能并没有改变。

    例子:

    print('re.X, re.VERBOSE')

    result = re.findall(r"""\d +  # the integral part

                       \.    # the decimal point

                       \d *  # some fractional digits""",

                        '007.008 \nmycar008\n', re.X)

    if result:

        print(result) 

    result = re.findall(r"\d+\.\d*",'007.008 \nmycar008\n')

    if result:

        print(result)

    结果输出如下:

    re.X, re.VERBOSE

    ['007.008']

    ['007.008']

     



    蔡军生 QQ:9073204 深圳



沪ICP备19023445号-2号
友情链接