首页 > 代码库 > day5模块学习--re正则模块

day5模块学习--re正则模块

1. 正则表达式基础

1.1. 简单介绍

    正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。

    下图展示了使用正则表达式进行匹配的流程:  http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

    技术分享

 

    正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。

    下图列出了Python支持的正则表达式元字符和语法:

    技术分享

    1.”.“匹配任意除换行符以外的字符

    >>> string = "abafsdafd\nafdasfd"         #包含换行符
  >>> string1 = "adfasdfadfasdfwer12345656耿"     #不包含换行符
  >>> import re  
  >>> m = re.search(".+",string)           #验证是否可以匹配换行符
  >>> m.group()
  ‘abafsdafd‘

    >>> n = re.search(".+",string1)
  >>> n.group()
  ‘adfasdfadfasdfwer12345656耿‘
    从上面输出结果可以看出,”.“是匹配任意除了换行符的字符。遇到"\n"换行符即终止匹配。

    2.”\"转义字符

    转义字符,使后一个字符改变原来的意思。如果字符串中有*号需要匹配,可以使用\*或者字符集[*],"a\.c"代表匹配a.c  "a\\c"代表匹配a\c

    >>> str_num = "22.567979mafdasdf"
  >>> m = re.search("\d+\.\d+",str_num)
  >>> m.group()
  ‘22.567979‘
    我们知道,"."在python中代表的含义是除了"\n"之外的所有字符,如果这里不进行转义的话,匹配出来的就是任意非"\n"字符,因此要使用"\"进行转义。

    >>> string = "dfafdasfd\fafdasfda"
  >>> string
  ‘dfafdasfd\x0cafdasfda‘
    在python中,如果字符串中包含"\",有时候会显示不出来,或者修改后面的内容,把别人改变了,这个不知道在Linux平台上是怎么回事。

    3.[...]字符集(字符类)   
    [...]:字符集(字符类)对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出[0,1,2,3,4,5,6,7,8,9],也可以给出范围[0-9]。第一个字符集如果是^表示取反,如[^abc]表示不是abc的其他字符。

    所有的特殊字符在字符集中都失去其原有的特殊意义。在字符集中如果要使用]、或^,可以在前面加上"\"反斜杠,或把]\、-放在第一个字符,把^放在非第一个字符。

    >>> string = "dafdafdasf[adfas^fad"

    >>> m = re.search("[a-z]+\[",string)
  >>> m.group()
  ‘dafdafdasf[‘
    从上面脚本可以看出,如果要匹配[要在前面加上"\"转义字符。

    >>> m = re.search("\w+[[]",string)      (1)在字符集中匹配"["
  >>> m.group()
  ‘dafdafdasf[‘
    >>> n = re.search("w+[\[]",string)      (2)转义匹配,验证在字符集中匹配[是否需要加[\]
  >>> n.group()
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  AttributeError: ‘NoneType‘ object has no attribute ‘group‘
    在字符集中如果要使用]、或^,可以在前面加上"\"反斜杠,或把]\、-放在第一个字符,把^放在非第一个字符。
    预定义字符集

    1.\d数字

    >>> m = re.search("\d",string)
  >>> m.group()
  ‘1‘
    \d是匹配数字,等价于[0-9]
    2.\D非数字       等价于[^\d]

    >>> string = "dfaMNA12581耿fa"
  >>> m = re.search("\D",string)
  >>> m.group()
  ‘d‘
  >>> n = re.search("[^\d]",string)
  >>> n.group()
  ‘d‘

    >>> l = re.search("[^0-9]",string)
  >>> l.group()
  ‘d‘
    从上面可以看出,“\D”是用来匹配非数字的,匹配除了数字0-9意外的任意字符,等价于[^0-9]或[^\d]
    3.\s空白字符     [<空格>\r\t\n\f\v]

    “\s”是匹配任意非空字符,如[<空格>\r\t\n\f\v]等,实例如下:

    >>> m = re.search("\s+",string)     #\s进行匹配空白字符
  >>> m.group()
  ‘ \t \n \x0c \x0b \r‘
    从上面可以看出,\s是匹配任意空白字符,如空格、\r、\t、\n、\f、\v等

    4.\S非空白字符     \S与\s正好相反,是匹配任意非空字符。等价于[^\s]匹配任意非空字符

    >>> string = "faMM耿 \t \n \f \v \rDASDF"
    >>> n = re.search("\S+",string)
  >>> n.group()
  ‘faMM耿‘
    从上面可以看出"\S"是匹配任意非空字符,遇到空的字符即停止了,匹配任意非空字符,"."匹配任意字符,除了换行符之外。

    >>> m = re.search(".+",string)
  >>> m.group()
  ‘faMM耿 \t ‘
    从上面看出,“\S”和“.”还是有差别的,一个是任意非空字符,一个是匹配任意除了"\n"意外任意非空字符。

    5.\w 单词字符[A-Z0-9a-z_]   
    \w是匹配单词字符,下面来看下能不能匹配汉字或其他:

    >>> string = "faMM耿 \t \n \f \v \rDASDF"

    >>> m = re.search("\w+",string)
  >>> m.group()
  ‘faMM耿‘                (1)脚本

    >>> format_string = "fdMM更KKMM长 /大MM \n \tMMKDSI"
  >>> m = re.search("\w+",format_string)
  >>> m.group()
  ‘fdMM更KKMM长‘          (2)脚本

    可以看出,"\w"是可以匹配汉字的,不能匹配空格,换行符这些,但是能够匹配汉字。

    6.   


 

 

 

 

 

 

 


           
 

  
  

 

day5模块学习--re正则模块