1.find_all方法
字符匹配
import re
target ='life is short ,i learn python'
result = re.findall('python', target)
# findall是re库的一个重要方法,第一个参数是匹配规则,第二个参数是要匹配的目标字
符串,findall返回的结果是一个列表。
result1=re.findall('java',target)
print(result,result1)
#结果是['python'][]
元字符
匹配规则 释义 [abf] 表示该位置的字符为a或者b或者f,即匹配成功 [a-z] 表示该位置上的字符在a-z之间,即匹配成功 [^a-z] 表示该位置上的字符不在a-z之间,即匹配成功 \d 表示该位置上的字符是数字,即匹配成功 \D 表示该位置上的字符不是数字,即匹配成功 \w 表示该位置上的字符是字母或_,即匹配成功 \W 表示该位置上的字符不是是字母或_,即匹配成功 \s 表示该位置上是不可见字符(空格、制表符\t、垂直制表符\v,回车符\r,换行符\n,换页符\f),即匹配成功 \S 表示该位置上是可见字符,即匹配成功
import re
target ='abc acc aec agc adc aic'
result=re.findall('a[de]c',target)
print(result)
#结果是['aec','adc']
result1=re.findall('a[b-z]c',target)
#这一行中的[b-z]表示这个位置上的字符在b-z范围内都可以匹配出来
print(result1)
#结果是['abc','acc','aec','agc','adc','aic']
result = re.findall('a[^c‐z]c', target)
#这一行中的[^c-z]表示这个位置的字符不在c-z范围内都可以匹配出来
print(result)
#结果是['abc']
target = '点赞数:12'
result = re.findall('\d', target)
print(result)
# 得到的结果是['1', '2']
#包括上述其他字符,得到的均为单个字符
匹配规则 释义 {3} 表示{3}前面的一个字符出现3次 {3,8} 表示{}前面的一个字符出现3-8次 ? 表示?前的一个字符出现0或1次 + 表示+前面的一个字符出现1次或无限多次 * 表示*前面的一个字符出现0次或无限多次
import re
content = '点赞数:12'
result = re.findall('\d{1,10}', content)
# 这一行中的\d表示一个数字字符,{1,10}表示这个\d出现1‐10次都匹配成功,只要点赞
数在0‐9999999999之间都可以匹配出来。
# 同样可以这样写:
# result = re.findall('\d+', content)
print(result)
# 得到的结果是'12'
匹配规则 释义 ^ 表示只要是以^后面的字符开头的,即匹配成功 $ 表示只要是以$前面的字符结尾的,即匹配成功
1 import re
2 content = 'https://www.zhihu.com'
3 content1 = '/question/62749917/answer/576934857'
4 result = re.findall('^http.*', content)
#这一行的^http表示匹配content的首部是http的内容,后面的.表示一个除换行符\n以外的所有字符,*表示.重复0次或无限多次,.*放在一起就是匹配除换行符以外的任意字符无限多次,这两个字符经常放在一起用
1 result1 = re.findall('^http.*', content1)
2 print(result)
3 # 得到的结果是['https://www.zhihu.com']
4 print(result1)
5 # 得到的结果是[],因为content1并不是以http开头
(\d+) ()内的内容构成一个组,只要当前位置满足\d+就匹配成功,返回()内匹配成功的内容
2 content = '发布于2018/12/23'
3 result = re.findall('.*?(\d.*\d)', content)
4 # 这一行的.*表示匹配除换行符外的任意字符,?表示非贪婪匹配,这个放在后面讲
5 # (\d.*\d)表示一个组,以数字开头,以数字结尾,.*表示中间可以是除换行以外的任意
字符
6 # 最终返回的结果就是括号内匹配到的结果。
7 print(result)
8 # 得到的结果是['2018/12/23']
2.match方法
1 import re
2 content = '发布于2018/12/23,发布人:十月。'
3 result = re.match('.*?(\d.*\d).*:(.*)', content)
4 # match方法的参数和findall是一样的,返回的结果是SRE_Match对象,对象有几个方法
需要了解一下
5 print(result.group())
6 # 得到的结果是'发布于2018/12/23,发布人:十月',该方法默认是result.group(0)
7 # 前文说过re.match('.*?(\d.*\d).*:(.*)', content)等价于
8 # re.match('(.*?(\d.*\d).*:(.*))', content)
9 # result.group(0)获取的内容就是最外层的括号匹配的内容。
10 print(result.group(1))
11 # 得到的结果是'2018/12/23',获取的内容是(\d.*\d)匹配到的内容
12 print(result.group(2))
13 # 得到的结果是'十月',获取的内容是(.*)匹配到的内容
14 print(result.groups())
15 # 得到的结果是('2018/12/23', '十月')
1 import re
2 content = '评论数:12'
3 result = re.match('\d', content)
4 print(result)
5 # 得到的结果是None,如果直接print(result.group())是会报错的。
6 # 原因在于match方法是从content第一个字符开始去匹配\d,如果未匹配到,直接就返回N
one。这里因为content第一个字符不是数字,所以直接返回None
非贪婪
1 # 实现功能:提取发布时间,比较贪婪与非贪婪
2 import re
3 content = '发布于2018/12/23'
4 result = re.findall('.*?(\d.*\d)', content)
5 # 这里的?表示的就是非贪婪模式,第一个.*会尽可能少地去匹配内容,因为后面跟的是\d,所以碰见第一个数字就终止了。
6 print(result)
# 得到的结果是['2018/12/23']
贪婪模式
1 import re
2 content = '发布于2018/12/23'
3 result = re.findall('.*(\d.*\d)', content)
4 # 这里的第一个.*后面没有添加问号,表示的就是贪婪模式,第一个.*会尽可能多地去匹配
内容,后面跟的是\d,碰见第一个数字并不一定会终止,当它匹配到2018的2的时候,发现剩
下的内容依然满足(\d.*\d),所以会一直匹配下去,直到匹配到12后面的/的时候,发现剩下
的23依然满足(\d.*\d),但是如果再匹配下去,匹配到23的2的话,剩下的3就不满足
(\d.*\d)了,所以第一个.*就会停止匹配,(\d.*\d)最终匹配到的结果就只剩下23了。
5 print(result)
6 # 得到的结果是['23']
8 我们再来看下这段代码:
9
10 import re
11 content = '发布于2018/12/23'
12 result = re.findall('.*(\d.*?\d)', content)
13 print(result)
14 # 得到的结果是['23'],原因在于第一个.*是贪婪模式,会一直匹配到12后面的/,这样结果就是['23']
1 import re
2 content = '发布于2018/12/23'
3 result = re.findall('.*?(\d.*?\d)', content)
4 # 这里的第一个.*?表示非贪婪模式,匹配到2018前面的'于'之后就停止了
5 # 括号里的.*?也是表示非贪婪模式,括号里的内容从2018的2开始匹配,因为后面一个数字
是0,那么也就满足了(\d.*?\d),所以就直接返回结果了,同样的,接下来的18也是这样,一
直匹配到23才结束。
6 print(result)
7 # 得到的结果是['20', '18', '12', '23']