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进行文本替换。其他的我也不怎么用,有时间可以多看看但是没必要学的太精。
参考阅读
发表评论