re模块

正则表达式在线测试工具 :http://tool.chinaz.com/regex/

正则表达式规则:

  A,字符组:[字符组], 出现在字符组 [ ] 内的所有字符都能匹配上,例如[1,2,3,4,5,a,#] 就能匹配到  1,2,3,4,5,a,#  中的任何一个字符,且一个字符组只能匹配一个字符

    可以以范围的形式出现 [0-9] , [a-z] ,[A-Z], 还可以出现多个范围 [a-zA-Z0-9!@#],但是范围必须从小到大,不如[a-Z]不行, [A-z]就可以,但从ASCII码中可以看出[A-z]还包含处字母外的其他                字符

 

  B,元字符:含有特殊意义

    \小写字母 代表能够匹配   \大写字符  代表相反的匹配   字符组 [\大小字母\小写字符]  即可匹配所有字符(包括换行符)

. 匹配出换行符以外的任意字符
\w 匹配数字或字母或下划线(word)
\s 匹配任意空白字符(space)
\d 匹配任意数字(digit)
\W 匹配非数字或字母或下划线
\S 匹配非空白字符
\D 匹配非数字
\n 匹配一个换行符(python中的 \n)
\t  匹配一个制表符(TAB键)
\b      匹配一个单词的结尾(x\b:匹配单词中以X结尾的x,xxyyx,则匹配到最后一个x)
^ 匹配字符串的开头(^abc:只匹配整个字符串开头的abc,其他任何地方包括其他行都匹配不到)
$ 匹配字符串的结尾(abc$:只匹配整个字符串结尾的abc,其他任何地方包括其他行都匹配不到)
a|b 匹配a或者b,返回两个结果(ab|abc:匹配ab或者abc,且优先匹配左边的,如果是abc的字符串,则只匹配ab,不匹配abc)
() 匹配小括号内的表达式,也表示一个组
[...] 匹配字符组中的字符([1,2,3]匹配1或2或3)
[^...] 匹配除了字符组中字符的所有字符([^1,2,3]:匹配除了1,2,3之外的所有字符)

   C,量词: 所有的量词都需要用正则匹配规则的前面

* 匹配0次或多次                
+ 匹配1次或多次
? 匹配0次或1次      
{n} 匹配n次
{n,} 匹配n次或者更多次
{n,m} 匹配n到m次

           

    D,分组 () ,或  |       ,分组后可重新使用量词 (\d\w)+  ,比如1a2b3c4d,就可以匹配出1a    ,2b3c4d

     或:  例如需要匹配身份证号码, ^([1-9]\d{16}[0-9x]|[1-9]\d[14])$

    E,转义符    \   r"\\d":让整个字符串不转义

    F,惰性匹配 : 在量词的后面加?可以使贪婪匹配变成惰性

           <script>...<script>        <.*>    -->   <script>...<script>(直接匹配整个)

                     <.*?>   -->   <script>,<script>   (可匹配出两个<script>)

        几个常用的惰性匹配:

                  *?   匹配任意多次,但是尽可能少重复

                  +?  匹配一次或多次,但是经可能少重复

                  ??  匹配一次或多次,但是尽可能少重复

                  {n,m}  匹配n次到m次,但是尽可能少重复

                   {n,}  匹配n次以上, 但是尽可能少重复

 

re模块:

1, re.findall()     返回所有满足匹配条件的结果,放在列表中     例如  re.findall('a','aabcda')     --->['a', 'a']

2,re.search()     从前往后找,找到一个就返回,返回的是一个对象,加上group()方法后才是对应的值,没有找到返回None,调用group()就会报错

       group()的原理 : 根据正则表达式的分组来选,为空时则取全部

3, re.match()     必须从第一个字符开始匹配,用法和search()一样

4, re.split('b' , 'abcd')   把abcd从b进行切割,得到 'a' 和‘bcd'

5, re.sub('a', '1', 'abcd')  把abcd中的a替换为 1

6 , re.subn()     用法和sub一样,但是subn() 多返回一个替换的次数

7,re.complie()   当某个规则需要多次使用时,可以先把规则进行编译

              rex = re.compile('a')

              ret = rex.search('abcd')    -->'a'

              ret2 = rex.match('aqwer')     -->'a'

8, re.finditer()  返回一个存放匹配结果的迭代器:  <callable_iterator object at 0x0000019A30990D30>    

    >>> ret = re.finditer('\d', '1ffg2gff3hg5')
    >>> print(ret.__next__().group())
    1
    >>> print(ret.__next__().group())
    2
    >>> print(ret.__next__().group())
    3
    >>> print(ret.__next__().group())
    5

 

注意:

  1,findall 的优先级查询   在正则表达式中有分组时,会优先匹配分组的内容,如果想要匹配结果,取消权限即可

    re.findall('www.(baidu|hello).com','www.baidu.com')

    >>>['baidu']

    在分组前加上?:  取消优先分组权限

      re.findall('www.(?:baidu|hello).com','www.baidu.com')

      >>>['www.baidu.com']

2, split  的优先级查询    

    >>> re.split('\d','abc1def2fgh')
      ['abc', 'def', 'fgh']

    加上分组之后 的结果会保留 匹配项    

    >>> re.split('(\d)','abc1def2fgh')
      ['abc', '1', 'def', '2', 'fgh']

posted @ 2020-03-19 15:12  2020不在低调  阅读(168)  评论(0)    收藏  举报