当先锋百科网

首页 1 2 3 4 5 6 7
模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n}精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。
re{n,}匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a | b匹配a或b
(re)匹配括号内的表达式,也表示一个组
\w匹配字母数字及下划线
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于 [\t\n\r\f].
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9].
\D匹配任意非数字
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\1匹配第1个分组的内容。

常用的函数

函数描述
re.match(pattern, string, flags=0)从字符串起始位置开始匹配,如果匹配失败直接返回none
re.search(pattern, string, flags=0)扫描整个字符串并返回第一个成功的匹配
re.findall(pattern, string, flags=0)找出所有满足条件的,返回一个列表
re.sub(pattern, repl, string, count=0, flags=0)用来替换字符串
re.compile(pattern[, flags])用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
re.split(pattern, string[, maxsplit=0, flags=0])使用正则来分割字符串

分组

在正则表达式中,可以对过滤到的字符串进行分组,分组使用圆括号的方式

  • group:和group(0)等价,返回的是满足条件的字符串
  • groups:返回的是里面的子组,索引从1开始
  • group(1):返回的是第一个子组

完整代码

import requests
import re

def parse_page(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
               'Referer': 'https://www.gushiwen.org/'
               }
    response = requests.get(url,headers=headers)
    text = response.text
    titles = re.findall(r'<div\sclass="cont">.*?<b>(.*?)</b>',text,re.DOTALL)#DOTALL 用于匹配换行符
    dynasties = re.findall(r'<p\sclass="source">.*?target="_blank">(.*?)</a>',text)
    autors = re.findall(r'<p\sclass="source">.*?<a.*?>.*?<a.*?>(.*?)</a>', text)
    contents = re.findall(r'<div class="contson".*?>(.*?)</div>',text,re.DOTALL)
    peoms = []
    for content in contents:
        content = re.sub(r'<.*?>',"",content)
        peoms.append(content.strip())
    poems = []
    for value in zip(titles,dynasties,autors,peoms):
        titles,dynasties,autors,peoms = value
        poem = {
            'title':titles,
            'dynasties':dynasties,
            'autors':autors,
            'peoms':peoms
        }
        poems.append(poem)
    for poem in poems:
        print(poem)


def main():
    url = 'https://www.gushiwen.org/default_2.aspx'
    for x in range(1,10):
        url = 'https://www.gushiwen.org/default_%s.aspx' %x
        parse_page(url)

if __name__ == '__main__':
    main()
  • 效果
  • 在这里插入图片描述

总结

用re时匹配注意是否贪婪匹配,还有group分组。感觉也没什么好总结的,多用,多写好吧!OK