Python正则表达式与面向对象详细教程!表哥花一个月归纳的!
|
前言 字符串是编程中非常常用的数据结构,对它的操作处理也非常重要。所以学透本知识点,对以后开发过程中对字符串处理,特别是爬虫、对用户输入数据的校验等非常重要。 对于之前从未接触编程的同学来说,"正则表达式"这个名字或许不那么见名知义,总之一看这个名字就让人感觉不太好理解。其实,正则表达式它还有另外一个名字:规则表达式,个人觉得这个"规则表达式"反而更容易被理解。 正则表达式,也即规则表达式,说白了就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对字符串的一种过滤逻辑。 常见的场景:对邮箱格式的校验、对手机号的合法性校验、爬虫中核心数据的获取... Python 自1.5版本起增加了re模块,re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串,即形参:pattern,来做为它们的第一个参数。 加/X:mmp9972 即可获取数十套PDF哦! 正则表达式的思想 正则表达式的设计思想是:用一种描述性的语言来定义一个规则,凡是符合此规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。 我们要学习的就是如何定义这个"规则"。 示例及说明 因为正则表达式也是用字符串表示的,所以我们要首先了解如何用字符来描述字符。
在正则表达式中,如果直接给出字符,就是精确匹配。用d可以匹配一个数字,w可以匹配一个字母或数字,例如: "123d"表示必须是123后跟一位任意数字的,可以匹配:1234、1235,但无法匹配123a "123w"表示必须是123后跟一位任意字母或数字的,可以匹配:1234、1235、123a "ddd"表示3个数字,可以匹配:123、110,但无法匹配abc、12a ·可以匹配任意字符,例如: "abc."表示必须是abc后跟一位任意字符的,可以匹配:abc!、abc1、abc,但无法匹配abc
要匹配变长的字符,在正则表达式中: 用*表示任意个字符(包括0个), 用+表示至少一个字符, 用?表示0个或1个字符, 用{n}表示n个字符, 用{n,m}表示n-m个字符。例如: 上面例子中的"ddd"可以简写为"d{3}"表示3个数字,可以匹配:123、110,但无法匹配abc、12a; "bo*k"可以匹配:bk、bok、book、booooooook等,但无法匹配boak 此处我们先介绍一个函数:re.findall(matten,string,flags) 功能:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。 语法格式:re.findall(matten,flags) 参数说明: matten:正则中的模式字符串。 string:要匹配的字符串。 flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 注意: 后面还会学习另外两个函数match 和 search,现在你只需知道 match 和 search是匹配一次,而 findall 匹配所有。 上面规则用代码验证如下: import re # 设计的正则表达式 pattern = "bo*k" # 待匹配的字符串 content = "bk-bok-book-boooooook-boak" # 用re.findall,在字符串中找到正则表达式所匹配的所有子串,放入一个列表中并返回,如果没有找到匹配的,则返回空列表。 result = re.findall(pattern,content) print(result) 运行结果: ['bk','bok','book','boooooook'] 同理,可以验证: "wo+w"可以匹配:wow、woow、woooooooow等,但无法匹配ww、woaw等; "wo?w"可以匹配:ww、wow等,但无法匹配woow、woooooooow、woaw等; "wo{2}w"可以匹配:woow,但无法匹配ww、wow、woooooooow、woaw等; "wo{2,10}w"可以匹配:woow、woooooooow、,但无法匹配ww、wow、woaw等;
对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。 ^匹配字符串开头,^d表示必须以数字开头。 $匹配字符串行末尾,d$表示必须以数字结束。 A|B可以匹配A或B,所以(H|h)ello可以匹配Hello或者hello。 你可能注意到了,he也可以匹配hello,但是加上^he$就变成了整行匹配,就只能匹配he了。 语法元素 符号含义描述·匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。*匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式+匹配前一个字符1次或多次?匹配一个字符0次或1次^匹配字符串开头。在多行模式中匹配每一行的开头$匹配字符串末尾,在多行模式中匹配每一行的末尾|或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式[ ]字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。所有特殊字符在字符集中都失去其原有的特殊含义。用反斜杠转义恢复特殊字符的特殊含义。{ }{m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次( )被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1.分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。 表示特定含义特殊字符: 符号含义描述w匹配数字字母下划线W匹配非数字字母下划线s匹配任意空白字符,等价于 [ ]S匹配任意非空字符d匹配任意数字,等价于 [0-9]。D匹配任意非数字A匹配字符串开始z匹配字符串结束Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。G匹配最后匹配完成的位置。匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。,匹配一个换行符。匹配一个制表符等 re模块 Python 自1.5版本起增加了re模块,re模块使 Python 语言拥有全部的正则表达式功能。 在设计规则表达式时,要特别注意字符转义。由于Python的字符串本身也用转义,所以要特别注意: # Python的字符串 content = 'ABC-001' # 对应的正则表达式字符串变成: # 'ABC-001' 因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了: # Python的字符串 content = r'ABC-001' # 对应的正则表达式字符串不变: # 'ABC-001'
re.match 方法尝试从字符串的起始位置去匹配一个模式,判断起始位置是否能匹配,如果匹配成功,返回一个Match对象,否则返回None。 函数语法:re.match(pattern,flags) 函数参数说明: 参数参数说明pattern匹配的正则表达式string要匹配的字符串flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 【示例】 re.match 方法是从起始位置去匹配的。注意区分下面两种匹配结果:
# 设计的正则表达式,3个数字
patten = r"d{3}"
# 两个待匹配的测试内容
content = "010-123456789"
content2 = "测试不在起始位置:010-123456789"
# 调用 re.match,获取匹配结果
result = re.match(patten,content)
result2 = re.match(patten,content2)
# 打印匹配结果
print(r"result = {}".format(result))
print(r"result2 = {}".format(result2))
运行结果: result =
split 方法按照能够匹配的子串将字符串分割后返回列表。 函数语法: re.split(pattern,string[,maxsplit=0,flags=0]) 函数参数说明: 参数参数说明pattern匹配的正则表达式string要匹配的字符串maxsplit分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 用正则表达式切分字符串比用固定的字符更灵活,常规切分代码:
content = "a b c d e"
print(content.split(" "))
打印切分结果: ['a','b','','c','d','e'] 缺陷是无法用连续的空格去切分,而正则表达式可以灵活切分: content = "a b c d e" # 用一个空格或连续空格 pattern = r"s+" print(re.split(pattern,content)) 打印切分结果: ['a','e'] 如果待分割的字符串中含有了其他字符"a,b; c d e",要得到['a','e'],也是可以的: content = "a,b; c d e" # 用一个空格或连续空格 pattern = r"[s,;]+" print(re.split(pattern,'e']
Python 的re模块提供了re.sub用于替换字符串中的匹配项。 语法:re.sub(pattern,repl,count=0) 参数说明: 参数参数说明pattern匹配的正则表达式repl替换的字符串,也可为一个函数。string要被查找替换的原始字符串。count模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 示例如下:
phone = "400-666-1234 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$',"",phone)
print("电话号码 : ",num)
# 移除非数字的内容
num = re.sub(r'D',num)
运行结果: 电话号码 : 400-666-1234 电话号码 : 4006661234
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。 re.finditer(pattern,flags=0) 此处参数和其他意义一样,不再赘述。
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。其中,被括起来的正则表达式将作为一个分组。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
