美文网首页
python-regex模块(正则表达式)

python-regex模块(正则表达式)

作者: stanf1l | 来源:发表于2018-03-25 00:08 被阅读0次
    re.png

    re模块

    在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。

    有一点需要特别注意的是,正则表达式使用 \ 对特殊字符进行转义,比如,为了匹配字符串 'python.org',我们需要使用正则表达式 'python\.org',而 Python 的字符串本身也用 \ 转义,所以上面的正则表达式在 Python 中应该写成 'python\\.org',这会很容易陷入 \ 的困扰中,因此,我们建议使用 Python 的原始字符串,只需加一个 r 前缀,上面的正则表达式可以写成:

    r'python\.org'
    

    贪婪匹配

    在 Python 中,正则匹配默认是贪婪匹配(在少数语言中可能是非贪婪),也就是匹配尽可能多的字符。

    比如,我们想找出字符串中的所有 div 块:

    import re
    content = 'aa<div>test1</div>bb<div>test2</div>cc'
    pattern = re.compile(r'<div>.*</div>')
    result = pattern.findall(content)
    print result
    

    执行结果:

    ['<div>test1</div>bb<div>test2</div>']
    

    由于正则匹配是贪婪匹配,也就是尽可能多的匹配,因此,在成功匹配到第一个</div> 时,它还会向右尝试匹配,查看是否还有更长的可以成功匹配的子串。

    如果我们想非贪婪匹配,可以加一个 ?,如下:

    import re
    content = 'aa<div>test1</div>bb<div>test2</div>cc'
    pattern = re.compile(r'<div>.*?</div>')    # 加上 ?
    result = pattern.findall(content)
    print result
    

    结果:

    ['<div>test1</div>', '<div>test2</div>']
    

    python中的字符串处理

    说点题外话,在匹配到字符串后,往往需要进行各种字符串操作,这里给个链接供大家参考,内容很全。


    正则表达式表示任意字符

    正则表达式可以用.*匹配任意除换行之外的字符。但如果内容中包含任意多个换行怎么匹配?用.*是匹配失败的。但可以用[\s\S]*?。

    \s是匹配所有空白字符,\S是匹配所有非空白字符,那么[\s\S]这个组合就可以匹配所有字符了。

    关于字符编码的问题

    Python3的普通字符串是str类型,实际上就是Python2的unicode类型。
    要真正理解清楚这个问题,需要看一看字符编码的知识,理解unicode编码方式和实现方式的关系。
    粗略的说,Python3使用的str类型并不关心你最终是什么编码,是gb2312还是utf-8,它只是用unicode的字符集编码来表示每一个字符,直到输出到文件流,需要转换为bytes类型时,才用encode指定具体的编码实现方式。

    参考资料

    相关文章

      网友评论

          本文标题:python-regex模块(正则表达式)

          本文链接:https://www.haomeiwen.com/subject/uiwccftx.html