在日常生活中,如果批量进行筛选或者操作某特定格式的信息,一个个进行操作工作效率会特别低,但使用正则表达式则可以大大提升工作效率。正则表达式就是描述字符串排列的一套规则,而这个规则是根据实际需求进行定义的。
1.正则表达式相关知识
1.常见打印字符与通用字符
符号 | 含义 |
\n | 用于匹配一个换行符 |
\t | 用于匹配一个制表符 |
\w | 匹配任意一个字母、数字或下划线 |
\W | 匹配除字母、数字和下划线以外的任意一个字符 |
\d | 匹配任意一个十进制数 |
\D | 匹配除十进制数以外的任意一个其它字符 |
\s | 匹配任意一个空白字符 |
\S | 匹配除空白字符以外的任意一个其它字符 |
2.元字符
符号 | 含义 | 示例 |
. | 匹配除换行符以外的任意字符 | .abc... |
^ | 匹配字符串的开始位置 | ^abc:必须以abc开始才能匹配 |
$ | 匹配字符串的结束位置 | abc$:必须以abc结尾才能匹配 |
* | 匹配0次、1次或多次前面原子 | a*:*代表0个、1个或多个a都能匹配 |
? | 匹配0次或者1次前面的原子 | a?:只有a或者aa能匹配 |
+ | 匹配1次或者多次前面的原子 | a+:+代表一个或者多个a |
{n} | 前面的原子出现n次 | a{2}:即aa (ab){2}:abab |
{n,} | 前面原子至少出现n次 | a{2,}:两个及以上a组成即可匹配 |
{n,m} | 前面原子出现n到m次 | a{2,4}:出现2个a、3个a或者4个a都可以匹配 |
| | 模式选择符,相当于或 | ^a|a$:指以a开头或者以a结尾的都可以匹配 |
() | 模式单元符 | (ab)*:将ab作为一个整体进行匹配 |
3.原子表
在正则表达式中,原子表是比较常用的一种表达,即[],括号内是原子符号,这相当于一个集合,匹配时对该原子表进行全局搜索并判断是否匹配,[abc]则表示由a、b、c组成的字符串。[^abc]则表示不包括abc三个原子。
[a-z]:所有小写字母 [A-Z]:所有大写字母 [a-zA-Z]:所有字母 [0-9]:表示所有数字
[^a-z]:除小写字母以外 [^A-Z]:除大写字母以外 [^a-zA-Z]:除所有字母以外 [^0-9]:除所有数字
4.几个常见的示例
(1)匹配.com或.cn后缀的URL网址
首先需要了解URL的构成再定义规则,pattern="[a-zA-Z]+://[^\s]{1,}[.com|.cn]"
URL中://是固定的,://之前不为空,则可以用[a-zA-Z]+或者[a-zA-Z]{1,}表示,最后结尾则是.com或者.cn,中间部分则根据需求来,都是非空字符串,则可以用[^\s]{1,}表示。
(2)匹配电话号码
固定电话有区号,区号有4位和3位,其中第一位基本以0开头,区号之后是-,然后是八位数字,匹配规则:
pattern="0\d{2}-\d{8}|0\d{3}-d{8}"。
(3)匹配电子邮件地址
pattern="\w+([.+-]\w+)*@\w+([.+-]\w+)*\.\\w+([.+-]\w+)*" 其实邮箱地址分为三段,由@和.分为三段,而这三段的匹配规则一致,组合起来便是这个规则。
2.Python中常见的正则表达式相关函数
1.re.match()函数
re.match(pattern,string,flag):pattern代表正则表达式,string则表示源字符串,flag则表示标志位,比如模式修正符等,可省略。
注意:该方法必须从首字符就开始匹配,否则匹配不通过。
代码如下:
匹配成功的:
import re
str="021-87562893"
pattern = "0\d{2}-\d{8}|0\d{3}-d{8}"
result = re.match(pattern,str)
print(result)
运行结果:
匹配失败的:
import re
str="3021-87562893"
pattern = "0\d{2}-\d{8}|0\d{3}-d{8}"
result = re.match(pattern,str)
print(result)
运行结果:
比较两种情况,可以理解match()方法的特点。
2.re.search()函数
re.search(pattern,string,flag),各参数含义同上。只不过该函数会扫描整个字符串,只要源字符串中包含该模式即可匹配。
代码如下:
import re
pattern="0\d{2}-\d{8}|0\d{3}-\d{8}"
string="330214-8284393782771"
result = re.search(pattern,string)
print(result)
运行结果如下:
从结果可以看出,该函数会对源字符串进行扫描。
3.全局匹配函数
从上述两个函数可以看出,即使源字符串中有多个结果符合要求,也只会匹配一个结果,而全局匹配函数则可以将所有符合要求的都找出。
首先用re.compile(pattern)将定义的正则表达式进行预编译;编译后,使用编译结果的findall(string)方法根据正则表达式在源字符串中将匹配的结果全部找出。
代码如下:
import re
pattern="0\d{2}-\d{8}|0\d{3}-\d{8}"
string="330014-828439378077-1999188345"
p1 = re.compile(pattern)
result = p1.findall(string)
print(result)
运行结果如下:
4.re.sub()函数
re.sub(pattern,rep,string,max):pattern代表正则表达式,rep代表要替换成的字符串,string代表源字符串,max表示最多替换的次数,可缺省,缺省代表全部替换。
import re
pattern="word"
string="awordwddwordokwordwww"
rep="WORD"
result = re.sub(pattern,rep,string)
print(result)
运行结果如下所示:
以上是正则表达式的一些基础以及Python中常用函数的使用介绍。通过对正则表达式的深入理解,可以为后续的爬虫打下基础。