python自带了正则表达式的模块,使用这个模块可以非常方便地通过正则表达式提取有规律的信息;
1.使用findall函数
findall的函数原型:
re.findall(pattern,string,flags=0)
pattern 表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志(例如:忽略大小写,忽略换行符)常省略
步骤:
import re content = "我的微博账户是: 1234567,QQ 密码是:33445566,银行卡密码是:888888,Gitthub密码是:999abc999,帮我记住他们" comp = ":(.*?)," comp_name="(我的.*?)d" passwd_list = re.findall(comp,content) name_list = re.findall(comp_name,content) account_passwd = re.search('账户是:(.*?),...密码是:(.*?),',content) # print(passwd_list) # print("我的密码分别是{}".format(passwd_list)) print(name_list) # print(account_passwd) # print(passwd_list) # print(account_passwd.group())
2.search函数
search()的用法和findall()的用法一样,但是search()只会返回第一个满足要求的字符串.一旦找到符合要求的内容,它就会停止查找.
search()函数原型:
re.search(pattern,string,flags=0) 和findall()一样
对于结果,如果匹配成功,则是一个正则表达式的对象;如果没有匹配到的任何数据,就是None.如果需要得到匹配的结果,则需要通过.group()这个方法来获取里面的值.
小结:
findall()和search()函数的用法基本差不多;
区别:
1.findall()会把匹配到的结果全部展示出来,而往往我们编写程序的时候,需要对匹配的结果进行筛选,这个时候
search()搭配的group()功能就非常有用了;此时如果用的是findall()还需要另外设置程序从结果中筛选符合要求的.而用search()搭配group()就能准确地定位到目标.
2.另外用findall()和search()的匹配结果也有所不同,例如上面示例代码:
如果把参数:
'账户是:(.*?),...密码是:(.*?)传给findall pattern 得出的结果是:
[(' 1234567', '33445566')]
而用search()同样的参数,匹配的结果是这样的:
<re.Match object; span=(4, 33), match='账户是: 1234567,QQ 密码是:33445566,'>
调用group() print(account_passwd.group()) 则是:
"账户是: 1234567,QQ 密码是:33445566,""
我们很容易发现,findall()匹配的结果中,只体现了小括号()中要提取的内容,
而用search()会加上,我们设定在小括号()外的内容,因此当我们需要加入说明文字的时候,这个时候用search就显得非常的有优势了;
识记要点:
findalll() 把所匹配结果展示到列表中,提取内容不包括括号指定.
search()常与group()搭配使用,提取指定内容,括号外非指定的内容可一同展示.