正则表达式及Python中常见的相关函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/carson0408/article/details/89839781

        在日常生活中,如果批量进行筛选或者操作某特定格式的信息,一个个进行操作工作效率会特别低,但使用正则表达式则可以大大提升工作效率。正则表达式就是描述字符串排列的一套规则,而这个规则是根据实际需求进行定义的。

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中常用函数的使用介绍。通过对正则表达式的深入理解,可以为后续的爬虫打下基础。 

猜你喜欢

转载自blog.csdn.net/carson0408/article/details/89839781