首页 > 编程 > Python > 正文

Python正则表达式完全指南

2020-02-16 01:35:16
字体:
来源:转载
供稿:网友

正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证、文本提取、替换等场景。爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果。

介绍正则表达式前,先来看一个问题,下面这段文本来自豆瓣的某个网页链接,我对内容进行了缩减。问:如何提取文本中所有邮箱地址呢?

html = """  <style>   .qrcode-app{    display: block;    background: url(/pics/qrcode_app4@2x.png) no-repeat;   }  </style>  <div class="reply-doc content">   <p class="">34613453@qq.com,谢谢了</p>   <p class="">30604259@qq.com麻烦楼主</p>  </div>  <p class="">490010464@163.com<br/>谢谢</p>  """

如果你还没接触过正则表达式,我想对此会是一筹莫展,不用正则,似乎想不到一种更好的方式来处理,不过,我们暂且放下这个问题,待学习完正则表达式之后再来考虑如何解决。

字符串的表现形式

Python 字符串有几种表现形式,以u开头的字符串称为Unicode字符串,它不在本文讨论范围内,此外,你应该还看到过这两种写法:

>>> foo = "hello">>> bar = r"hello"

前者是常规字符串,后者 r 开头的是原始字符串,两者有什么区别?因为在上面的例子中,它们都是由普通文本字符组成的串,在这里没什么区别,下面可以证明

>>> foo is barTrue>>> foo == barTrue

但是,如果字符串中包括有特殊字符,会是什么情况呢?再来看一个例子:

>>> foo = "/n">>> bar = r"/n">>> foo, len(foo)('/n', 1)>>> bar, len(bar)('//n', 2)>>> foo == barFalse>>>

"/n" 是一个转义字符,它在 ASCII 中表示换行符。而 r"/n" 是一个原始字符串,原始字符串不对特殊字符进行转义,它就是你看到的字面意思,由 "/" 和 "n" 两个字符组成的字符串。

定义原始字符串可以用小写r或者大写R开头,比如 r"/b" 或者 R"/b" 都是允许的。在 Python 中,正则表达式一般用原始字符串的形式来定义,为什么呢?

举例来说,对于字符 "/b" 来说,它在 ASCII 中是有特殊意义的,表示退格键,而在正则表达式中,它是一个特殊的元字符,用于匹配一个单词的边界,为了能让正则编译器正确地表达它的意义就需要用原始字符串,当然也可以使用反斜杠 "/" 对常规定义的字符串进行转义

>>> foo = "//b">>> bar = r"/b">>> foo == barTrue

正则基本介绍

正则表达式由普通文本字符和特殊字符(元字符)两种字符组成。元字符在正则表达式中具有特殊意义,它让正则表达式具有更丰富的表达能力。例如,正则表达式 r"a.d"中 ,字符 'a' 和 'd' 是普通字符,'.' 是元字符,. 可以指代任意字符,它能匹配 'a1d'、'a2d'、'acd' ,它的匹配流程是:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表