模式 | 描述 |
---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当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)
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