python数据提取-正则表达式

1.正则表达式
  (1)re的findall()方法
import re
r_list = re.findall('AB', 'ABCABDDGAAGDSGSDG') #后匹配前
print(r_list)
#输出:['AB', 'AB']

  (2)也可以写作下面
import re
pattern = re.compile('AB')
r_list = pattern.findall('ABCABDDGAAGDSGSDG')
print(r_list)

2.常用元字符
  .      任意一个字符(不包括\n)
  \d    一个数字
  \s    空白字符
  \S    非空白字符
  []     包含[]内容
  *     出现0次或多次
  +     出现1次或多次
  \w+  普通字符出现一次或多次
  匹配任意一个字符的正则表达式:
(1)使用[\s\S]
pattern = re.compile('[\s\S]')
result = pattern.findall(html)
(2)使用re.S
pattern = re.compile('.‘,re.S)
result = pattern.findall(html)

re模块使用流程:
  (1)方法1
r_list = re.findall('正则表达式',html,re.S)
  (2)方法2
pattern = re.compile('正则表达式',re.S)
r_list = pattern.findall(html)

使用findall()方法得到的结果一定是列表,re.S作用为正则表达式元字符,. 可匹配\n在内的所有字符

3.贪婪匹配和非贪婪匹配
  (1)贪婪匹配:在整个表达式匹配成功的前提下,尽可能多匹配 * + ?
      表达式: .* .+ .?
  (2)非贪婪匹配:在整个表达式匹配成功的前提下,尽可能多匹配 * + ?
      表达式:.*? .+? .??

例子:
import re
html = '''
<div><p>XXXXXXXXX</div></p>
<div><p>XXXXXXXXXX</div></p>
'''
pattern = re.compile('<div><p>.*?</div></p>',re.S)
r_list = pattern.findall(html)
print(r_list)

pattern = re.compile('<div><p>(.*?)</div></p>',re.S)
r_list = pattern.findall(html)
print(r_list)
  #只匹配XXX内容

##贪婪匹配</div></p>也会被认为任意字符,所有使用非贪婪匹配解决上面匹配特定内容问题

例子:
import re
html = 'A B C D'
pattern = re.compile('\w+\s+\w+',re.S)
r_list = pattern.findall(html)
print(r_list)
输出:['A B', 'C D']

import re
html = 'A B C D'
pattern = re.compile('(\w+)\s+\w+',re.S)
r_list = pattern.findall(html)
输出:['A', 'C']

总结:
在网页中想抓取什么内容,就在正则表达式中此位置加()
匹配时先按照整体正则匹配,然后再提取分组()中内容
2及以上分组(),则结果中以元组形式显示[(),(),()]

 

posted on 2023-11-18 19:18  枫飘过的天1  阅读(287)  评论(0编辑  收藏  举报