- 正则表达式:简称regex,故在Python中通过re模块来支持正则表达式,它可以用来进行模式匹配、提取、查找和替换。通俗来讲,就是用特殊字符的组合来搜索匹配目标文本的一种表达式,在Python中我们可以用来提取目标文件,如爬虫时提取自己想要的文字信息。
1、常用正则表达式符号
了解正则表达式的定义之后,接下来就是利用正则表达的这些特殊符合和字符(又称元字符)来提取我们想要的信息了,下面以表格的形式列出常用的特殊字符的表示意义,并通过示例直观的了解其含义;
字符表示 | 描述 | 正则表达式模式串 | 匹配的字符串 | 备注 |
---|---|---|---|---|
literal | 直接匹配字面字符串literal | qwer | qwer | 字面意思直接匹配 |
re1|re2 | 匹配正则表达式re1或者re2 | apple|orange | at、orange | 择一匹配,|就是常见的“或”d的意思 |
. | 匹配任何单个字符(除/n外) | gr.st | grast、grbst、gr*st、 | .可以匹配除"/n"之外的任何字符。 |
^ | 匹配字符串起始部分 | ^to | top、tolert | 匹配任何以to开头的字符串 |
$ | 匹配字符串终止部分 | com$ | baidu.com 、Sogou.com | 匹配任何以com结尾的字符串 |
* | 匹配0次或多次其前字符 | |||
+ | 匹配1次或多次其前字符 | |||
? | 匹配0次或1次其前字符 | |||
{N} | 匹配N次其前的字符 | |||
{M,N} | 匹配M~N次其前的表达式 | |||
[ ] | 匹配[ ]里面的任何单个字符 | y[opd]o | yoo、ypo、ydo | 用于匹配[ ]特定的字符(或 的关系) |
注:若想显示匹配句点(.)和其它一些本意的字符($)怎么办呢? 使用反斜线转义字符,例如匹配. 则使用\.可以显示匹配.
原始字符:r 例如\b这类已经有个\了,\b表示ASCII字符的退格符,同时也是正则表达式的单词边界,当然我们可以使用\,但是有人觉得\\bText,实在是不好看,就规定说用r来表示吧,表示为r'\bText'。
还有一些简单的特殊字符的表示例如\d,\w,\s,\b,\c等这些特殊字符表示方法。也有一些扩展的表示方法,这些都是用方括号()括着的,进行指定分组的匹配,这里不在一一列举,在任何Python教材基本都能查询这些表示方法,记住一些常见的特殊组合就行。
2、限定范围和否定表达式
首先了解一下搜索和匹配的不同
搜索:在字符串中的任意部分中进行搜索匹配
匹配:判断一个字符能否从起始处全部或者部分的匹配某个模式。
连字符(-):指定的字符范围,如A-Z、a-z或者0-9分别表示大写字母、小写字母和数值数字。
脱字符(^):如果它紧跟在左方括号后面,表示为不匹配给定字符集中的任何一个字符。
正则表达式模式 | 匹配的字符串 | 备注 |
m.[0-9] | 字母m后面跟着任何一个字符,然后跟着一个数字 | |
[^aeiou] | 匹配一个非元音字符 | |
[^\t\n] | 不匹配制表符或者/n | |
["-a] | 在ASCII系统中,所有字符位于“ ”和“a”之间 | 即在34-97之间 |
对于匹配的次数我们需要了解一下什么是贪婪匹配;
贪婪匹配:顾名思义,贪婪的匹配所有符合的字符串,
非贪婪模式:使用问号(?)去贪婪,匹配尽可能少的字符,尽可能留下多的字符给后面的模式(如果存在)。
3、正则表达式与Python
Python语言通过re模块支持正则表达式。下面我们就以通俗的语言介绍一下re模块的一些核心函数和方法,当然具体使用方法可以参考官方文档;
函数/方法 | 描述 | 备注 |
compile(patter,flags=0) | 编译正则表达式,返回一个正则表达式对象。 | |
match(patter,string,flags=0) | 从起始位置开始匹配 | 成功的话,返回匹配对象 |
search(patter,string,flags=0) | 搜索字符串中包含的要匹配的字符串 | |
findall(patter,string,[.flags]) | 查询全部的非重复情况 | 返回一个列表,包含所有的成功匹配的部分 |
finditer(patter,string,[.flags]) | 在匹配对象中迭代 | |
spilt(patter,string,max=0) | 分割字符串 | 返回分割后的列表 |
re模块函数和正则表达式对象方法 | ||
sub(patter,repl,string,count=0) | 搜索和替换 | subn()还返回了一个替换的总数 |
purge() | ||
常用的匹配对象方法 | ||
group(num=0) | 返回整个匹配对象,或特定子组 | 输出匹配成功的字符串 \n,n表示分组编号,可以转换顺序。 |
groups(default=None) | 返回一个元组 | 获取所有匹配成功的子组 无子组则返回为空 |
groupdict(default=None) | ||
常用的模块属性 | ||
re.I | 不区分大小写 | |
re.L | ||
re.M | ||
re.S | ||
re.X | ||
扩展符号 | ||
(?:) | 进行分组但不保存 | |