④正则表达式基础知识

来源:互联网 发布:加工中心编程软件下载 编辑:程序博客网 时间:2024/05/15 03:27
在抓取网页的过程中,面对复杂繁琐的标签或字符时,使用findAll()或者find()函数也许可以定位到符合我们某些简单要求的内容。但是,当我们需要执行更为复杂的文本筛选工作时,findAll()或者find()函数可能就无法帮助我们了,这时候,我们往往需要使用另外一种工具——正则表达式。

一、正则表达式基础概念

正则表达式是一种描述字符串结构模式的形式化方法。正则表达式是搜索、替换和解析复杂字符模式的一种强大而标准的方法。简单来说,正则表达式是为了满足我们查找符合某些复杂规则的字符串的需要,并且描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。看完上面的概念之后,是不是觉得正则表达式的概念晦涩难懂?借用《精通正则表达式》里的一段话:近年来,一种“通用的模式语言”已经发展起来,它功能强大,描述能力也很强,可以用来解决各种问题。不同的程度以不同的方式来实现和使用这种语言,但是综合来说,这种功能强大的模式语言和模式本身被称为“正则表达式”(regular expression)。完整的正则表达式由两种字符构成,一种是普通字符,‘a’,’B’,‘1’等。另一种是特殊字符,‘*’,‘|’等。这些特殊字符又称为元字符。正是这些元字符给予了正则表达式强大的功能和灵活性。我们可以把正则表达式想像为我们一直在学习的英语。正则表达式中的普通字符对应于英语中的单词,而正则表达式中的特殊字符对应于英语中的语法。单词与语法的正确使用,我们就能用英语表达我们的思想。同样,普通字符和特殊字符的正确结合,我们就能通过正则表达式得到符合要求的文本。

二、正则表达式的元字符

元字符是正则表达式中的特殊符号。通过使用元字符,我们可以用正则表达式匹配多个字符串。其中,正则表达式能够匹配字符串是指这个正则表达式能在字符串中找到匹配文本。<1>择一匹配符号“|”re1 | re2 匹配正则表达式re1或者re2例如:at|home能够匹配的字符串为“at”“home”bat|bet|bit能够匹配的字符串为” bat”” bet”” bit”<2>任意匹配符号“.”“.”匹配除了换行符\n以外的任何字符,包含字母、数字、空格、可打印字符、不可打印字符、符号。例如:f.o能够匹配在字母“f”和字母“o”之间的任意一个字符,”f9o”” f*o”。..能够匹配任意两个字符。”ab””12”<3>脱字符”^”和美元符号“$”脱字符”^”匹配字符串的起始部分。例如:^From能够匹配任何以From作为起始的字符串。”FromChina”美元符号“$”匹配字符串的终止部分。例如:/bin/tcsh$能够匹配任何以/bin/tcsh$作为结尾的字符串。”Program  Files/bin/tcsh”<4>特殊字符“\b”“\B”特殊字符“\b”匹配任何单词的边界例如:\bthe能够匹配任何以the开始的字符串。“theafaf”“theioajg” the\b能够匹配任何以the结束的字符串。“adsathe”“dasthe”特殊字符“\B”匹配任何单词的中间例如:\Bthe能够匹配任何包含the但不以其起始的字符串。“adstheadd”<5>方括号“[ ]”方括号“[ ]”表示“逻辑或”的功能。方括号“[ ]”能够匹配方括号“[ ]”中包含的任何字符。例如:b[aeiou]t能够匹配的字符串为:“bat”“bet”“bit”“bot””but”<6>连字符“-”方括号中两个符号中间用连字符连接,用于指定一个字符的范围。例如:[0-9]能够匹配任何一个数字:“0”“6”[r-u][env-y][us]字母“r” 或“s” 或“t”或“u”后面跟着“e” 或“n” 或“v” 或“w” 或“x” 或“y”再跟着“u” 或“s”。此外,存在一种特殊情况,即[^x-y]表示不匹配x到y之间的任何一个字符。例如:[^\t\n]表示不匹配制表符和\n。<7>可选项符号”?” 特殊符号“?”代表之前紧邻的元素出现0次或者1次。colou?r能够匹配的字符串为“colour”“color”,即无论“u”是否出现,正则表达式都是能够匹配成功的。但是,值得注意的是,colou?r无法匹配semicolon,这是由于最后一个字母“r”无法匹配。<8>重复出现符号“+”“*”符号“+”代表之前紧邻的元素出现一次或多次。<9>区间符号“{}”{M~N}待变之前紧邻的元素出现M~N次。<10>字符集特殊符号“\d”“\w””\s”“\d”匹配任何十进制数,与[0-9]一致。“\w”匹配任何字母数字字符,与[A-Za-z0-9]一致。<11>圆括号“()”圆括号“()”有两个功能:1.对正则表达式进行分组。2.匹配子组。最后,值得注意的是,如果需要匹配的某个字符本身就是元字符,那么这时我们需要使用反斜杠“\”转义。例如,我们需要显示匹配一个句点“.”,必须使用反斜杠转义句点符号的功能,即“\.”。

三、正则表达式和Python语言

Python通过标准库中的re模块来支持正则表达式。
import re
**一、使用match()函数匹配字符串**match()函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回None。其语法为:re.match( pattern , string , flags = 0)pattern:正则表达式string:被匹配的字符串。flags:标志位,用于控制正则表达式的匹配方式。如:是否区分大小写,多行匹配等等。
import  re#在起始位置匹配print(re.match('www','www.baidu.com').span())#不在起始位置匹配print(re.match('com','www.baidu.com'))#m是调用match()函数之后返回的匹配对象m = re.match('foo','foo')if m is not None:    print(m.group())#由于匹配的失败,返回值为None(注意:None没有group()方法)m = re.match('foo','bar')print(m)m = re.match('foo', 'food on the table')print(m.group())print(re.match('foo','food on the table').group())#匹配多个字符串bt = 'bat|bet|bit'print( re.match(bt,'bat').group())#匹配任何单个字符anyend = '.end'print(re.match(anyend,'bend').group())#匹配除了\n之外的任何单个字符anyend = '.end'print(re.match(anyend,'\nend').group())#匹配字符集print(re.match('[cr][23][dp][o2]','c3po').group())print(re.match('[cr][23][dp][o2]','c2do').group())#重复、特殊字符以及分组print(re.match('\w\w\w-\d\d\d','abc-123').group())#print(re.match('\w\w\w-\d\d\d','abc-xyz').group())print(re.match('(\w\w\w)-(\d\d\d)','abc-123').group())print(re.match('(\w\w\w)-(\d\d\d)','abc-123').group(1))print(re.match('(\w\w\w)-(\d\d\d)','abc-123').group(2))print(re.match('(\w\w\w)-(\d\d\d)','abc-123').groups())
二、匹配对象以及group()和groups()方法处理正则表达式时,除了正则表达式对象外,还有另一个对象类型——匹配对象,即成功调用match()或search()返回的对象。匹配对象的属性:1.string: 匹配时使用的文本。2.re: 匹配时使用的pattern对象。3.pos: 文本中正则表达式开始搜索的索引。4.endpos: 文本中正则表达式结束搜索的索引。匹配对象的方法:1.group([group1, …]):返回整个匹配对象,或者根据要求返回匹配对象的特定子组。参数为多个时,将以元组形式返回匹配对象。参数为0时,返回整个匹配对象,不填写参数时,默认返回整个匹配对象;如果匹配失败,则返回None;2.groups([default]):返回一个包含唯一或者全部子组的元组。等价于group(1,2,…last)。3.start([group]):返回匹配对象在string中的起始索引。4.end([group]):返回匹配对象在string中的结束索引。5.span([group]):返回(start(group), end(group))。三、使用search()函数匹配字符串search()函数会扫描整个字符串并返回第一个成功的匹配。其语法为:re.search(pattern, string, flags=0)pattern:正则表达式string:被匹配的字符串。flags:标志位,用于控制正则表达式的匹配方式。如:是否区分大小写,多行匹配等等。
import  re#在起始位置匹配print(re.search('www','www.baidu.com').span())#不在起始位置匹配print(re.search('com','www.baidu.com').span())#匹配多个字符串bt = 'bat|bet|bit'print( re.search(bt,'He bit me!').group())#匹配任何单个字符anyend = '.end'print(re.search(anyend,'The end').group())
0 0
原创粉丝点击