Python正则表达re模块之findall()详解⽬录
⼀、re.findall函数介绍
它在re.py中有定义:
def findall(pattern, string, flags=0):
"""Return a list of all non-overlapping matches in the string.
If one or more capturing groups are present in the pattern, return
a list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result."""
return _compile(pattern, flags).findall(string)
返回string中所有与pattern匹配的全部字符串,返回形式为数组。
findall()函数的两种表⽰形式
import re
kk = repile(r’\d+’)
kk.findall(‘one1two2three3four4’)
#[1,2,3,4]
#注意此处findall()的⽤法,可传两个参数;
kk = repile(r’\d+’)
re.findall(kk,“one123”)
#[1,2,3]
⼆、代码如下
后⾯会讲解代码⾥的各个部分,先列出来~
import re
str = ‘aabbabaabbaa’
#⼀个"."就是匹配除 \n (换⾏符)以外的任意⼀个字符
print(re.findall(r’a.b’,str))#[‘aab’, ‘aab’]
#前⾯的字符出现0次或以上
print(re.findall(r’a b’,str))#[‘aab’, ‘b’, ‘ab’, ‘aab’, ‘b’]
#贪婪,匹配从.*前⾯为开始到后⾯为结束的所有内容
print(re.findall(r’a.*b’,str))#[‘aabbabaabb’]
#⾮贪婪,遇到开始和结束就进⾏截取,因此截取多次符合的结果,中间没有字符也会被截取
print(re.findall(r’a.*?b’,str))#[‘aab’, ‘ab’, ‘aab’]
#⾮贪婪,与上⾯⼀样,只是与上⾯的相⽐多了⼀个括号,只保留括号的内容
print(re.findall(r’a(.*?)b’,str))#[‘a’, ‘’, ‘a’]
str = ‘’‘aabbab
aabbaa
bb’’’ #后⾯多加了2个b
#没有把最后⼀个换⾏的aab算进来
print(re.findall(r’a.*?b’,str))#[‘aab’, ‘ab’, ‘aab’]
#re.S不会对\n进⾏中断
print(re.findall(r’a.*?b’,str,re.S))#[‘aab’, ‘ab’, ‘aab’, ‘aa\n b’]
三、re.findall中正则表达式(.*?)
字符串是
str = ‘aabbabaabbaa’
1. 符号 . 就 是匹配除 \n (换⾏符)以外的任意⼀个字符
print(re.findall(r’a.b’,str))
#[‘aab’, ‘aab’]
2.符号 * 前⾯的字符出现0次或以上
print(re.findall(r’a b’,str))
#[‘aab’, ‘b’, ‘ab’, ‘aab’, ‘b’]
3.符号. 贪婪,匹配从.前⾯为开始到后⾯为结束的所有内容
print(re.findall(r’a.b’,str))
#[‘aabbabaabb’]
4.符号.? ⾮贪婪,遇到开始和结束就进⾏截取,因此截取多次符合的结果,中间没有字符也会被截取
print(re.findall(r’a.?b’,str))
#[‘aab’, ‘ab’, ‘aab’]
5.符号(.?) ⾮贪婪,与上⾯⼀样,只是与上⾯的相⽐多了⼀个括号,只保留括号的内容
print(re.findall(r’a(.?)b’,str))
#[‘a’, ‘’, ‘a’]
关于带括号与不带括号的区别
import re
string=“abcdefg acbdgef abcdgfe cadbgfe”
#不带括号
regex=repile("((\w+)\s+\w+)")
print(regex.findall(string))
#输出:[(‘abcdefg acbdgef’, ‘abcdefg’), (‘abcdgfe cadbgfe’, ‘abcdgfe’)]
regex1=repile("(\w+)\s+\w+")
print(regex1.findall(string))
#输出:[‘abcdefg’, ‘abcdgfe’]
regex2=repile("\w+\s+\w+")
print(regex2.findall(string))
#输出:[‘abcdefg acbdgef’, ‘abcdgfe cadbgfe’]
第⼀个 regex 中带有2个括号,其输出list 中包含2个 tuple
第⼆个 regex 中带有1个括号,其输出内容是括号匹配到的内容,⽽不是整个表达式所匹配到的结果。
第三个 regex 中不带括号,其输出的内容就是整个表达式所匹配到的内容。
实际上这并不是python特有的,这是正则所特有的 , 任何⼀门⾼级语⾔使⽤正则都满⾜这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了⼀个括号】。在正则⾥⾯ “()” 代表的是分组的意思,⼀个括号代表⼀个分组,你只能匹配到 “()” 中的内容。
四、re.findall中参数re.S的意义
1.字符串变为(后⾯多加了2个b)
str = ‘’‘aabbab
aabbaa
bb’’’
2.参数⽆re.S,没有把最后⼀个换⾏的aab算进来
print(re.findall(r’a.*?b’,str))
#[‘aab’, ‘ab’, ‘aab’]
3.参数有re.S,不会对\n进⾏中断
print(re.findall(r’a.*?b’,str,re.S))
#[‘aab’, ‘ab’, ‘aab’, ‘aa\n b’]
⼀个随机切换user_agent的第三⽅python库:my_fake_useragent 因为my_fake_useragent 是第三⽅,所以需要⾃⼰进⾏安装。
不⽤担⼼,它没有任何依赖或者附加环境,只安装它⾃⼰就⾏。
⽅法1:
pycharm传统安装⽅式。
⽅法2:
pip install …
fake_useragent 和 my_fake_useragent 其实是⼀个东西。
使⽤:这⾥只列举两个最简单的⽅式去调⽤。
#-*- coding: utf-8 -*-
import my_fake_useragent as ua
if __name__ =='__main__':
user_agent = ua.UserAgent()
# ⽅法1
# 随机获取⼀个user-agent,每次获取的都不⼀样
for _ in range(10):
print(user_agent.random())
# ⽅法2
# _useragent_list():返回⼀个user-agent的列表
for index, each_useragent in enumerate(_useragent_list()): print(index,': ', each_useragent)
既然说到了user_agent,那就再多说⼀点。
乍看user agent 时,只觉得它是⼀串乱七⼋糟的字符串,其实包含的内容还是挺多的。中⽂名为⽤户代理(区别于爬⾍时使⽤的代理ip),简称UA,是⼀个特殊字符串头,使得服务器能够识别客户使⽤
的操系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语⾔等。
⼀些⽹站常常通过 UA 来给不同的操作系统、不同的浏览器发送不同的页⾯。
UA字串的标准格式:
浏览器标识(操作系统标识;加密等级标识;浏览器语⾔)渲染引擎标识 版本信息
下⾯列举 UA 中包含的字符串信息
操作系统标识
FreeBSD
X11; FreeBSD (version no.) i386
X11; FreeBSD (version no.) AMD64
Linux
X11; Linux ppc
X11; Linux ppc64
X11; Linux i686
X11; Linux x86_64
Mac
Macintosh; PPC Mac OS X
Macintosh; Intel Mac OS X
Solaris
X11; SunOS i86pc
X11; SunOS sun4u
Windows:
Windows NT 10.0 对应操作系统windows 10
windows NT 6.2 对应操作系统 windows 8
Windows NT 6.1 对应操作系统 windows 7
Windows NT 6.0 对应操作系统 windows vista
Windows NT 5.2 对应操作系统 windows 2003
Windows NT 5.1 对应操作系统 windows xp
Windows NT 5.0 对应操作系统 windows 2000
Windows ME
Windows 98
加密等级标识
N: 表⽰⽆安全加密
I: 表⽰弱安全加密
python正则表达式不包含U: 表⽰强安全加密
浏览器语⾔
在⾸选项 > 常规 > 语⾔中指定的语⾔
渲染引擎
浏览器 使⽤ Presto 渲染引擎,格式为: Presto/版本号
版本信息
显⽰ 浏览器 真实版本信息,格式为: Version/版本号
⽤这些信息去刚才的python代码输出中去对照,基本都能到对应的信息。说这些,其实是python爬⾍⾯试过程中可能会被问到的⼀个点,虽然是个冷门的知识点,不过了解⼀下也好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。