tips:常用的匹配字符放在最后。本文重点写五种匹配方法的区别。

1.使用区别:

search

使用re.search是知道你需要的是什么,在偌大的文本里面找到这一个东西,你必须已知这个东西的唯一特点。并且只能返回符合条件的第一个值,因此要求你提供的特点必须保证唯一性,否则返回的第一个值不一定是自己需要的。

返回的值是一个match类型,需要用group提取内容。

match

和search差不多,不过作用条件更为苛刻,只能作用在字符串开头,其他情况返回None

findall

re.findall是返回所有满足条件的列表,一般用于爬虫等需要大量相似数据的情况,你需要知道这一系列东西的共性,找寻条件要比search简单,并且适用范围更大。个人更喜欢这种方法。

split

返回在每次匹配时拆分字符串的列表,实例中直观说明。(获取信息匹配时一般用不到,一般用在input中获取输入信息拆分为列表或是用在长列表的拆分。)

sub

用字符串替换一个或多个匹配项,多一个repl参数,即replace(替代)。

pattern用于匹配字符,replace用于替代这个匹配字符,他们长度可以不一样。

(获取信息匹配时一般用不到,一般用于全局替换某个内容,修改数据。)

************************************************************************************************

2.实例

这个东西要想理解还是通过例子比较合适。

同一个文本,我们用五种方式匹配:(匹配方式是匹配两个相邻的数字)

1.search(找到第一个)

import re

txt ="Ca 45 wad 65 123 3 wsf s 1 s"

x = re.search(pattern=r'\d{2}', string=txt)

print(x)

这里返回的match类型就可以依次看出匹配类型,匹配内容的所在位置(span)和匹配内容。

tips:需要提取值的话这样写: 

x = re.search(pattern=r'\d{2}', string=txt).group()

2.match(在开头找)

import re

txt ="Ca 45 wad 65 123 3 wsf s 1 s"

x = re.match(pattern=r'\d{2}', string=txt)

print(x)

这里虽然有匹配项但是不在开头,因此返回为None

tips:search和match的共同特殊参数:span:返回匹配到字符的开始到结束的范围。eg:(0,2)

表示第0个位置到第1个位置,也就是第一个字符到第二个字符。也就是说匹配到的字符的位置为字符串的第一个字符和第二个字符。

3.findall(找到所有)

import re

txt ="Ca 45 wad 65 123 3 wsf s 1 s"

x = re.findall(pattern=r'\d{2}', string=txt)

print(x)

 从左到右依次匹配,匹配成功过的字符不再进行二次匹配,例如上txt的‘123’字符串,只会匹配到‘12’。

 4.split(拆分)

import re

txt ="Ca 45 wad 56 123 3 wsf s 1 s"

x = re.split(pattern=r'\d{2}', string=txt)

print(x)

                

我的匹配是两个相邻的数字,split的意思就是将我的这个匹配方式作为分割点,把其他的字符串作为列表输出。就像这样:

Ca 45 wad 56 123 3 wsf s 1 s

返回了4个字符串作为一个列表。即上文本黄色的标识部分。其中红色部分为分割点。

tips:maxsplit参数可以指定分割次数,返回的列表的字符串数目为分割次数+1。

5.sub(替换)

import re

txt ="Ca 45 wad 56 123 3 wsf s 1 s"

x = re.sub(pattern=r'\d{2}',repl='000',string=txt)

print(x)

 

 tips:count参数可以控制替换的次数。

3.正则表达式基本使用方法

常用的:

******************************************************************************************************

额外的:

 \d:匹配一个数字。

\w:匹配一个字母或数字或下划线。

集合:例子:        [abc]:匹配a或b或c。

重复:用{}表示,{3}表示重复3次这样的匹配。

[1-9]{3}:匹配1-9的数字并且重复3次.(即找到所有百位的数)

[19]{3}:匹配1或者9重复3次的数字,eg:119,911,111,999

捕获:用()表示,捕获小括号之中的字符,小括号外写匹配的特点。在下文贪婪匹配可以理解。

****************************************************************************************************

*因此,上实例的findall中,\d{2}表示匹配两个数字。

含有\的匹配内容前一般加个r,表示不要把‘\’理解成转义字符,而当做匹配的特殊字符。

改变txt为"12 Ca 45 wad 56 123 3 wsf s 1 s"

如果写成\d则会有这样的结果:

如果写成\w则会:

***集合的组合:

import re

txt ="12 Ca 45 wad 56 123 3 wsf s 1 s4454545"

x = re.findall(pattern=r'[45]{2}',string=txt)

print(x)

 即匹配4或者5出现两次的数字,匹配方式如下:

12 Ca 45 wad 56 123 3 wsf s 1 s4454545

**如果重复次数为多选,那么会优先匹配重复次数多的项:

import re

txt ="12 Ca 45 wad 56 123 3 wsf s 1 s4454545"

x = re.findall(pattern=r'[45]{2,3}',string=txt)

print(x)

 匹配方式如下:

12 Ca 45 wad 56 123 3 wsf s 1 s4454545

***非贪婪匹配与贪婪匹配:

字如其名,非贪婪就是最小的匹配项,贪婪就是最大的匹配项。

【假设我需要匹配:从某个字符开头从另一个字符结束的一个片段。】

        1.非贪婪匹配(.*?):

                tips:这里利用到了捕获,如果不用捕获,匹配内容则会包含12和45。

import re

txt ="12 Ca 45 wad 56 123 3 wsf s 1 s4544545"

x = re.findall(pattern=r'12(.*?)45',string=txt)

print(x)

匹配方式(其中紫色为匹配项,红色为匹配前后条件):

12 Ca 45 wad 56 123 3 wsf s 1 s4544545

        2.贪婪匹配(.*):

若将(.*?)改为(.*)

匹配方式:

12 Ca 45 wad 56 123 3 wsf s 1 s4544545

匹配特定内容实例:

例如我需要找到众多邮箱中的网易邮箱,那么它的特点就是@163.com,我还需要给他一个开头的起始位置避免他获取了上一行的内容,例如我可以给一个字母m,即上一行的最末尾。我还需要给他一个结尾,避免他获取下一行的内容,例如我可以给一个.com,但是这里每一个的结尾都是com,因此我想到用非贪婪匹配,匹配最小项,那么只会匹配到一个邮箱完整的内容。代码如下。

import re

txt =("xu3843483408@qq.com"

"15548208@163.com"

"6849656@qq.com"

"xfa687465469@163.com")

x = re.findall(pattern=r'm(.*?@163.com)',string=txt)

print(x)

emmm关于正则表达式大致内容如上,上述列举了大部分情况可以解决问题的正则表达式使用方法。我一般都用findall结合捕获和非贪婪匹配用于爬虫或者用sub进行文本替换。其他的我也不怎么用,有时间可以多看看但是没必要学的太精。

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: