正则表达式入门

题记

本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。

正则表达式在很多的应用中都有使用到,特别是在网络爬虫中格式化html后取出自己需要的属性,在字符串的匹配和查找中也有很多的应用。

本文主要使用python对正则表达式进行说明,并配合合适的代码。

怎么着协作手提式有线电话机号码

正则表明式的平整,1开头看的时候,会感觉规则太多太乱,毫无规律可寻,看完了多少个例证以往,稳步的开采部分常用的表明式未来,写起前面包车型客车条条框框就便于得多了。

此间以什么样合营手提式无线电话机电话号码为例子

最简单易行的无绳电电话机规律为十三个数字,正则表明式为:

\d{11}

诸如此类我们就感到凡事字符串中有1二位数字就以为是手机号码,不过实际中还恐怕有此外一些平整,1234567891二那也是拾1个数字,可是我们今后并不会认为她是手提式有线电电话机号码,所以越来越把规则写细了。

大家还是能够更进一步的细分为,一叁x启幕,14x开端,一七(1367八)开头,1八x开端,前面再带5人的数字,还会有另一种情景是170的场馆,在那之中第三位为[0589]中的二个数,再带五个人数字。
表明式能够写为:

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正则表明式语法

大家刚刚用到的\d
在正则表明式中,代表着数字的意思,还足以用[0-9]来表示1个数字。语法比较多,可是常用的并不是相当多,图中意味的是大规模的语法。

字符串相称:

语法 含义
\d 数字
\D 非数字
\s 空白符
\S 非空白符
\w 单词字符
\W 非单词字符

数码格外:

语法 含义
* 匹配前面字符0次到无限次
+ 匹配前面字符1次到无限次
匹配前面字符0到1次
{m} 匹配前面字符m次
{m,n} 匹配前面字符m到n次

相配边界:

语法 含义
^ 匹配字符串开头
$ 匹配字符串末尾

图中的表明式都有特地的事例介绍,能够大致的探访,要求利用的时候在非常来进展查询。

python中的re模块

在python中,有特意的模块来顶住正则表达式,正是re模块。

字符串是或不是合作规则

比方说在用户注册里,大家渴求用户输入的手提式无线电话机号码,符合手提式有线电话机号码的原理,可以用正则表达式来限制。

查阅字符串中
是否有符合供给的字符串,如故以刚才的手提式无线电话机号码为例:

import re
str = '15259340987'
# 将正则表达式编译成Pattern对象
pattern = re.compile('152\d{8}')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match(str)
if match:
    # 使用Match获得分组信息
    print match.group()

此间能够看来正则表明式,用的是

re.compile('152\d{8}')

本条说明式比

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

是严厉好多的,他只特别,15二从头的手提式无线电电话机号码,当然表明式能够依靠你和谐的内需来挑选,这里只是给三个实例。

寻找装有符合规则的字符串

在网页爬虫中,大家要求找寻网页的说有链接,用正则相配就特别轻便做到,查看网页源代码中的html,带有网页链接的代码为

href="http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml"

正则表明式能够写成:

href="(.*?)"

python代码为:

import re
str = 'href="http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml"'
# 匹配
links = re.findall('href="(.*?)"', str)

for link in links:
    print link

# 输出为: 
# http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml

搜索了有着供给的链接。

re模块中珍视的接口

  • re.compile(pattern, flags=0)

    这一个主意是Pattern类的工厂方法,用于将字符串方式的正则表明式编写翻译为Pattern对象。
    第2个参数flag是般配格局,取值能够采纳按位或运算符’|’表示还要生效,比方re.I
    |
    re.M。其余,你也足以在regex字符串中钦赐方式,比如re.compile(‘pattern’,
    re.I | re.M)与re.compile(‘(?im)pattern’)是等价的。

    语句

    prog = re.compile(pattern)
    result = prog.match(string)

    result = re.match(pattern, string)
    对等,第三种写法较为便宜。

  • re.search(pattern, string, flags=0)

    其壹办法用于查找字符串中能够相称成功的子串。从string的pos下标处起尝试相配pattern,假设pattern甘休时仍可万分,则赶回二个Match对象;若不可能同盟,则将pos加1后再行尝试匹配;直到pos=endpos时仍力不从心协作则赶回None。
    pos和endpos的暗中同意值分别为0和len(string));re.search()不可能钦赐那七个参数,参数flags用于编写翻译pattern时钦定相称情势。

  • re.match(pattern, string, flags=0)

    其一法子将从string的pos下标处起尝试相称pattern;要是pattern停止时仍可极其,则赶回二个Match对象;倘使相配过程中pattern无法相配,只怕合营未终止就已达到endpos,则赶回None。
    pos和endpos的暗中同意值分别为0和len(string);re.match()不或者钦命那七个参数,参数flags用于编写翻译pattern时钦命相配形式。
    专注:这么些方式并不是一点一滴合营。当pattern甘休时若string还也会有剩余字符,如故视为成功。想要完全合作,能够在表明式末尾加上边界相称符’$’。

  • re.split(pattern, string, maxsplit=0, flags=0)

    安份守己能够包容的子串将string分割后回到列表。maxsplit用于钦点最大分割次数,不点宿将整个区划。

  • re.findall(pattern, string, flags=0)

    寻找string,以列表格局再次来到全体能匹配的子串。

  • re.sub(pattern, repl, string, count=0, flags=0)

    运用repl替换string中每三个协作的子串后归来替换后的字符串。
    当repl是一个字符串时,能够使用\id或\g

常用的正则表明式语句

  • 协作邮箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}

  • 相称华语:[\u4e00-\u9fa5]

  • 匹配IP(IPV4):(\d+).(\d+).(\d+).(\d+)

  • 10分身份证:\d{15}|\d{17}[0-9Xx]

  • 相配手提式有线话机号:(一叁\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正则表明式工具

正则表达式语法相比复杂,初始未有经历的话,调节和测试起来比较辛苦,以后英特网有广大的正则表明式工具,能帮忙大家十分的快的进展考试。有客户端的工具也会有web工具,用起来都比较便利。

用的较多的是RegexBuddy那1款工具,如图,他得以自动的生成各个语言版本的正则表明式的例子:
如下

图片 1

更加多入门教程可以参见:[http://www.bugingcode.com/python_start/]
(http://www.bugingcode.com/python_start/)