zoukankan      html  css  js  c++  java
  • 正则表达式之python实现

    前文:

    首先,什么叫正则表达式(Regular Expression)?
        例如我们要判断字符串"adi_e32fv,Ls"里面是否含有子串"e32f",又例如我们在一个含百万个姓名的txt文件中找姓“王”,名字以“五”结尾的名字,然后打印出来。结果为:“王五”、“王小五”、“王大五”、“王小小五”……
        以前我们是使用字符串函数来查找的,但是代码实现起来会很复杂。如今用正则表达式只需要一句 re.findall('王.*?五',txt1) 就可以了!正则表达式是写网络爬虫的最基本的知识,可以用正则表达式在html中搜集满足某些字串要求的网址。下面是个人对正则表达式基础知识的一些总结。
    (操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)

    正文:
    1、首先要导入python的re模块。

    2、元字符 . ^ $ * + ? {} [] | ()
    re模块中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字符串'dit dot det,dct dit dot'中匹配'dit'结果为:    
    str1 = 'dit dot det,dct dit dot'
    print re.findall('dit',str1)
    结果:['dit', 'dit']

    |作用'dit|dct'表示dit或者dct。
    <span style="font-family:KaiTi_GB2312;">str1 = 'dit dot det,dct dit dot'
    print re.findall('dit|dct',str1)</span>
    结果:['dit', 'dct', 'dit']

    []作用[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:
    str1 = 'dit dot det,dct dit dot'
    print re.findall('d[ic]t',str1)
    结果:['dit', 'dct', 'dit']

    ^作用一:[^ic]中^表示否定,即除了i和c:
    str1 = 'dit dot det,dct dit dot'
    print re.findall('d[^ic]t',str1)
    结果:['dot', 'det', 'dot']

    ^作用二:^dit表示子串dit在开头位置,而dct不是在开头:
    str1 = 'dit dot det,dct dit dot'
    print re.findall('^dit',str1)
    print re.findall('^dct',str1)
    结果:['dit'][]

    $作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:
    str1 = 'dit dot det,dct dit dot'
    print re.findall('dot$',str1)
    print re.findall('dct$',str1)
    结果:['dot'][]

    .作用d.t表示d与t之间省略了一个任意字符:
    str1 = 'dit dot det,dct dit dot'
    print re.findall('d.t',str1)
    结果:['dit', 'dot', 'det', 'dct', 'dit', 'dot']

    +作用di+t表示d与t之间省略了一个或多个'i':
    str1 = '<span style="font-family: KaiTi_GB2312;">d dt dit diit det</span><span style="font-family: KaiTi_GB2312;">'</span>
    print re.findall('d.+t',str1)
    结果:['dit', 'diit']

    *作用di*t表示d与t之间省略了零个至多个'i':
    str1 = '<span style="font-family: KaiTi_GB2312;">d dt dit diit det</span><span style="font-family: KaiTi_GB2312;">'</span>
    print re.findall('d.*t',str1)
    结果:['dt', 'dit', 'diit']

    经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:
    <span style="font-family:KaiTi_GB2312;">str1 = 'd dt dit diit det'
    print re.findall('d.+t',str1)
    print re.findall('d.*t',str1)</span>
    结果:['d dt dit diit det']['d dt dit diit det']

    ?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')
    str1 = '<span style="font-family: KaiTi_GB2312;">d dt dit diit det'</span>
    print re.findall('d.+?t',str1)
    结果:['dit', 'dot', 'det', 'dct', 'dit', 'dot']

    ?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:
    str1 = 'd dt dit diit det'
    print re.findall('di?t',str1)
    结果:['dt', 'dit']

    {}作用一:di{n}t表示d和t之间有n个'i':
    str1 = 'dt dit diit diiit diiiit'
    print re.findall('di{2}t',str1)
    结果:['diit']

    {}作用二:di{n,m}t表示d和t之间有n到m个'i':
    str1 = 'dt dit diit diiit diiiit'
    print re.findall('di{1,3}t',str1)
    结果:['dit', 'diit', 'diiit']
    其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:
    str1 = 'dt dit diit diiit diiiit'
    print re.findall('di{1,}t',str1)
    print re.findall('di{,3}t',str1)
    print re.findall('di{,}t',str1)
    结果:['dit', 'diit', 'diiit', 'diiiit']
          ['dt', 'dit', 'diit', 'diiit']
          ['dt', 'dit', 'diit', 'diiit', 'diiiit']

    作用一:取消元字符,变成转义字符:
    <span style="font-family:KaiTi_GB2312;">str1 = '^abc ^abc'
    print re.findall('^abc',str1)
    print re.findall('^abc',str1)</span>
    结果:[]['^abc', '^abc']

    作用二:预定义字符
    str1 = '12 abc 345 efgh'
    print re.findall('d+',str1)
    print re.findall('w+',str1)
    结果:['12', '345']
          ['12', 'abc', '345', 'efgh']

    ()作用在匹配字符串后,只输出匹配字串'()'里面的内容:
    str1 = '12abcd34'
    print re.findall('12abcd34',str1)
    print re.findall('1(2a)bcd34',str1)
    print re.findall('1(2a)bc(d3)4',str1)
    结果:['12abcd34']
          ['2a']
          [('2a', 'd3')]


    3、re模块里的主要方法:findall()、finditer()、match()、search()compile()、split()、sub()、subn()。

    re.findall(pattern,string,flags = 0)
    作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab cd'
    print re.findall('w+',str1)</span>
    结果:['ab', 'cd']

    re.finditer(pattern,string,flags = 0)
    作用:其功能与re.findall相同,但结果以迭代器的形式返回。
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab cd'
    iter1 = re.finditer('w+',str1)
    for a in iter1:
        print a.group(),a.span()</span>
    结果:ab (0, 2)
          cd (3, 5)
    (注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)

    re.search(pattern,string,flags = 0)
    作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。
    <pre name="code" class="python"><span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab cd'
    result = re.search('cd',str1)
    if result == None:
        print 'None'
    else:
        print result.group(),result.start(),result.end()</span>
    结果:cd 3 5

    
    re.match(pattern,string,flags = 0)
    作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab cd'
    result = re.match('cd',str1)
    if result == None:
        print 'None'
    else:
        print result.group(),result.start(),result.end()</span>
    结果:None

    re.compile(pattern,flags = 0)
    作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab cd'
    pre = re.compile('ab')
    print pre.findall(str1)</span>
    结果:['ab']

    re.split(pattern,string,maxsplit = 0,flags = 0)
    作用:在string匹配pattern的时候做分割:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'ab.c.de'
    str2 = '12+34-56*78/90'
    print re.split('.',str1)
    print re.split('[+-*/]',str2)</span>
    结果:['ab', 'c', 'de']
          ['12', '34', '56', '78', '90']


    re.sub(pattern,repl,string,count = 0,flags = 0)
    作用:在string当中把满足pattern正则的字串替换成repl:
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'abcde'
    print re.sub('bc','123',str1)</span>
    结果:a123de

    re.subn(pattern,repl,string,count = 0,flags = 0)
    作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
    <span style="font-family:KaiTi_GB2312;font-size:18px;">str1 = 'abcdebce'
    print re.subn('bc','123',str1)</span>
    结果:('a123de123e', 2)





  • 相关阅读:
    13年7月memory point
    getDefinitionByName getDefinition 区别
    cocos2d-html5版日历组件
    一个js对象的代码结构
    计算机操作系统复习
    计算机组成原理复习
    最新的hustoj搭建姿势
    推荐算法学习笔记
    BUPT 2012复试机考 4T
    BUPT 2012复试机考 3T
  • 原文地址:https://www.cnblogs.com/Bone-ACE/p/4531305.html
Copyright © 2011-2022 走看看