match,group
match重开头匹配
In [4]: print(string)
<link rel="alternate" href="https://mya.wordpress.org/" hreflang="mya" />
<link rel="alternate" href="https://nb.wordpress.org/" hreflang="nb" />
<link rel="alternate" href="https://ne.wordpress.org/" hreflang="ne" />
<link rel="alternate" href="https://nl.wordpress.org/" hreflang="nl" />
<link rel="alternate" href="https://nl-be.wordpress.org/" hreflang="nl-be" />
<link rel="alternate" href="https://nn.wordpress.org/" hreflang="nn" />
<link rel="alternate" href="https://oci.wordpress.org/" hreflang="oci" />
<link rel="alternate" href="https://ory.wordpress.org/" hreflang="ory" />
<link rel="alternate" href="https://os.wordpress.org/" hreflang="os" />
<link rel="alternate" href="https://pan.wordpress.org/" hreflang="pa" />
<link rel="alternate" href="https://pl.wordpress.org/" hreflang="pl" />
<link rel="alternate" href="https://ps.wordpress.org/" hreflang="ps" />
# ?非贪婪模式
In [7]: result = re.match(r'^.*?https://(.*?)/".*', string)
# group()返回整个匹配
In [8]: result.group()
Out[8]: '<link rel="alternate" href="https://mya.wordpress.org/" hreflang="mya" />'
# group(1)返回匹配第一个小括号的值
In [9]: result.group(1)
Out[9]: 'mya.wordpress.org'
匹配模式
# .不能匹配换行符
In [10]: result = re.match(r'^.*?https://(.*?)/".*ps"\s/>', string)
In [11]: result
In [12]: print(result)
None
# 添加re.S匹配模式,就可以使.匹配换行符
In [13]: result = re.match(r'^.*?https://(.*?)/".*ps"\s/>', string, re.S)
In [14]: print(result)
<re.Match object; span=(0, 876), match='<link rel="alternate" href="https://mya.wordpress>
re.search
搜索整个文本返回一个
In [15]: result = re.search(r'https://(.*?)/"', string)
In [16]: result.group()
Out[16]: 'https://mya.wordpress.org/"'
In [17]: result.group(1)
Out[17]: 'mya.wordpress.org'
re.findall
所有匹配的结果
In [22]: result = re.findall(r'https://(.*?)/.*?hreflang="(\w+)"', string)
In [23]: result
Out[23]:
[('mya.wordpress.org', 'mya'),
('nb.wordpress.org', 'nb'),
('ne.wordpress.org', 'ne'),
('nl.wordpress.org', 'nl'),
('nn.wordpress.org', 'nn'),
('oci.wordpress.org', 'oci'),
('ory.wordpress.org', 'ory'),
('os.wordpress.org', 'os'),
('pan.wordpress.org', 'pa'),
('pl.wordpress.org', 'pl'),
('ps.wordpress.org', 'ps')]
re.sub
替换掉匹配的字符, 可以用来清洗不规则字符串
In [40]: result = re.sub(r'https://.*?\.org/', 'www.baidu.com', string)
In [41]: print(result)
<link rel="alternate" href="www.baidu.com" hreflang="mya" />
<link rel="alternate" href="www.baidu.com" hreflang="nb" />
<link rel="alternate" href="www.baidu.com" hreflang="ne" />
<link rel="alternate" href="www.baidu.com" hreflang="nl" />
<link rel="alternate" href="www.baidu.com" hreflang="nl-be" />
<link rel="alternate" href="www.baidu.com" hreflang="nn" />
<link rel="alternate" href="www.baidu.com" hreflang="oci" />
<link rel="alternate" href="www.baidu.com" hreflang="ory" />
<link rel="alternate" href="www.baidu.com" hreflang="os" />
<link rel="alternate" href="www.baidu.com" hreflang="pa" />
<link rel="alternate" href="www.baidu.com" hreflang="pl" />
<link rel="alternate" href="www.baidu.com" hreflang="ps" />
# \1就是前一个括号匹配的内容,再次使用
In [44]: result = re.sub(r'(https://.*?)\.org/', r'\1.cn', string)
In [47]: print(result)
<link rel="alternate" href="https://mya.wordpress.cn" hreflang="mya" />
<link rel="alternate" href="https://nb.wordpress.cn" hreflang="nb" />
<link rel="alternate" href="https://ne.wordpress.cn" hreflang="ne" />
<link rel="alternate" href="https://nl.wordpress.cn" hreflang="nl" />
<link rel="alternate" href="https://nl-be.wordpress.cn" hreflang="nl-be" />
<link rel="alternate" href="https://nn.wordpress.cn" hreflang="nn" />
<link rel="alternate" href="https://oci.wordpress.cn" hreflang="oci" />
<link rel="alternate" href="https://ory.wordpress.cn" hreflang="ory" />
<link rel="alternate" href="https://os.wordpress.cn" hreflang="os" />
<link rel="alternate" href="https://pan.wordpress.cn" hreflang="pa" />
<link rel="alternate" href="https://pl.wordpress.cn" hreflang="pl" />
<link rel="alternate" href="https://ps.wordpress.cn" hreflang="ps" />
re.compile
匹配对象
content = """
<li data-rid="1">
<div class="book-img-box">
<a href="//book.qidian.com/info/1010734492" data-bid="1010734492" data-eid="qd_B57" target="_blank"><img src="//bookcover.yuewen.com/qdbimg/349573/1010734492/150"></a>
</div>
<div class="book-mid-info">
<h4><a href="//book.qidian.com/info/1010734492" target="_blank" data-eid="qd_B58" data-bid="1010734492">凡人修仙之仙界篇</a></h4>
<p class="author">
<img src="//qidian.gtimg.com/qd/images/ico/user.f22d3.png"><a class="name" href="//my.qidian.com/author/4362771" data-eid="qd_B59" target="_blank">忘语</a><em>|</em><a href="//www.qidian.com/xianxia" target="_blank" data-eid="qd_B60">仙侠</a><i>·</i><a class="go-sub-type" data-typeid="22" data-subtypeid="207" href="javascript:" data-eid="qd_B61">神话修真</a><em>|</em><span >连载中</span>
</p>
<p class="intro">
凡人修仙,风云再起时空穿梭,轮回逆转金仙太乙,大罗道祖三千大道,法则至尊《凡人修仙传》仙界篇,一个韩立叱咤仙界的故事,一个凡人小子修仙的不灭传说。特说明下,没有看过前传的书友,并不影响本书的阅读体验,
</p>
<p class="update"><span ><style>@font-face { font-family: MHtuPQQy; src: url('https://qidian.gtimg.com/qd_anti_spider/MHtuPQQy.eot?') format('eot'); src: url('https://qidian.gtimg.com/qd_anti_spider/MHtuPQQy.woff') format('woff'), url('https://qidian.gtimg.com/qd_anti_spider/MHtuPQQy.ttf') format('truetype'); } .MHtuPQQy { font-family: 'MHtuPQQy' !important; display: initial !important; color: inherit !important; vertical-align: initial !important; }</style><span class="MHtuPQQy">𘜶𘜰𘜲𘜸𘜭𘜷</span>万字</span>
</p>
</div>
</li>
.....
"""
In [58]: pattern = re.compile(r'">(.*)</a></h4>')
In [59]: result = re.findall(pattern, content)
In [60]: result
Out[60]: ['凡人修仙之仙界篇', '圣墟', '诡秘之主', '修真聊天群', '大王饶命', '牧神记', '大医凌然', '太初', '明朝败家子',
'汉乡']
实战
In [17]: response = requests.get('https://www.qidian.com/all')
In [41]: pattern = re.compile('<li.*?<h4><.*?>([\u4e00-\u9fa5]+)</a></h4>.*?<img.*?<a.*?">([\u4e00-\u9fa5]+)</a><em>.*?<p class="intro">\s+(.*?)</p>', re.S)
In [43]: len(re.findall(pattern,response.text))
Out[43]: 20
In [44]: results = re.findall(pattern,response.text)
In [47]: for title, author, description in results:
...: title = re.sub('\s*', '', title)
...: author = re.sub('\s*', "", author)
...: description = re.sub('\s*', "", description)
...: print("[+]", title, author, description)
...:
[+] 凡人修仙之仙界篇 忘语 凡人修仙,风云再起时空穿梭,轮回逆转金仙太乙,大罗道祖三千大道,法则至尊《凡人修仙传》仙界篇,
一个韩立叱咤仙界的故事,一个凡人小子修仙的不灭传说。特说明下,没有看过前传的书友,并不影响本书的阅读体验,
[+] 圣墟 辰东 在破败中崛起,在寂灭中复苏。沧海成尘,雷电枯竭,那一缕幽雾又一次临近大地,世间的枷锁被打开了,一个全新的世
界就此揭开神秘的一角……
[+] 诡秘之主 爱潜水的乌贼 蒸汽与机械的浪潮中,谁能触及非凡?历史和黑暗的迷雾里,又是谁在耳语?我从诡秘中醒来,睁眼看见这
个世界:枪械,大炮,巨舰,飞空艇,差分机;魔药,占卜,诅咒,倒吊人,封印物……光明依旧照耀,神秘从未远离,
[+] 修真聊天群 圣骑士的传说 某天,宋书航意外加入了一个仙侠中二病资深患者的交流群,里面的群友们都以‘道友’相称,群名片都
是各种府主、洞主、真人、天师。连群主走失的宠物犬都称为大妖犬离家出走。整天聊的是炼丹、闯秘境、炼功经验啥的。
[+] 大王饶命 会说话的肘子 高中生吕树在一场车祸中改变人生,当灵气复苏时代来袭,他要做这时代的领跑者。物竞天择,胜者为王。
……全订验证群号:696087569
[+] 牧神记 宅猪 大墟的祖训说,天黑,别出门。大墟残老村的老弱病残们从江边捡到了一个婴儿,取名秦牧,含辛茹苦将他养大。这一
天夜幕降临,黑暗笼罩大墟,秦牧走出了家门……做个春风中荡漾的反派吧!瞎子对他说。秦牧的反派之路,
[+] 大医凌然 志鸟村 医学院学生凌然有一个小目标,要成为世界上最伟大的医生,结果不小心实现了。
[+] 太初 高楼大厦 一树生的万朵花,天下道门是一家。法术千般变化,人心却亘古不变
[+] 明朝败家子 上山打老虎额 弘治十一年。这是一个美好的清晨。此时朱厚照初成年。此时王守仁和唐伯虎磨刀霍霍,预备科举。此时
小冰河期已经来临,绵长的严寒肆虐着大地。此时在南和伯府里,地主家的傻儿子,南和伯的嫡传继承人方继藩……开始了
[+] 汉乡 架空历史 我们接受了祖先的遗产,这让中华辉煌了数千年,我们是如此的心安理得,从未想过要回归那个在刀耕火种中苦苦寻
找出路的时代。反哺我们苦难的祖先,并从中找到故乡的真正意义,将是本书要讲的故事。
[+] 深夜书屋 纯洁滴小龙 一家只在深夜开门营业的书屋,欢迎您的光临。————————《舵主群》:587980337(进群粉丝值验证
)《读书群》:523978007(无需验证)《战斗群》:457654443(无需验证)
[+] 超神机械师 齐佩甲 韩萧,《星海》骨灰级代练,被来自东(zuo)方(zhe)的神秘力量扔进穿越大军,携带玩家面板变成NPC,回到
《星海》公测之前,毅然选择难度最高的机械系。战舰列队纵横星海,星辰机甲夭矫如龙,幽能炮毁天灭
[+] 全球高武 老鹰吃小鸡 武者的世界~简介无力,被迫修改(一群群号555700424已满,二群群号931250725)
[+] 恶魔就在身边 汉宝 陈曌能召唤恶魔,能够看到死亡。“别西卜,用你暴食者的能力,为这位客户治疗一下厌食症。”“雷蒙,这位
老年人想重新获得男性的能力,你懂的。”“老黑,你和我说实话,这人什么时候死,怎么死……什么?你不知道,
[+] 修炼狂潮 傅啸尘 这是一个科学与武道并重的时代,大灾变之后,人类发现了超古代修炼文明,开启了一个大修炼时代,并开始了昆
仑界的殖民之路!这是一个人类危机重重,同时也是一个热血沸腾的,强者辈出的时代!得到了超古代文明强者丹
[+] 飞剑问道 我吃西红柿 在这个世界,有狐仙、河神、水怪、大妖,也有求长生的修行者。修行者们,开法眼,可看妖魔鬼怪。炼一口
飞剑,可千里杀敌。千里眼、顺风耳,更可探查四方。……秦府二公子‘秦云’,便是一位修行者……
[+] 三寸人间 耳根 举头三尺无神明,掌心三寸是人间。这是耳根继《仙逆》《求魔》《我欲封天》《一念永恒》后,创作的第五部长篇
小说《三寸人间》。
[+] 学霸的黑科技系统 超级科技 “系统,积分能兑钱吗?”“不能。”“干,那我要你何用!”“本系统能让你当上学爸,全人类爸爸
的爸,你还要钱有什么用?”
[+] 黎明之剑 远瞳 高文穿越了,但穿越的时候稍微出了点问题。在某个异界大陆上空飘了十几万年之后,他觉得自己可能需要一具身体
才算是成为一个完整的穿越者,但他并没想到自己好不容易成功之后竟然还需要带着这具身体从棺材里爬出来,
[+] 秦吏 七月新番 战国之末,华夏千年未有之大变局。有人天生世卿。有人贵为公子。他却重生成秦国小卒黑夫,云梦秦简中的小人物
。为免死于沟壑,为掌握自己命运,他奋力向上攀爬。好在,他赶上了一个大时代。六王毕,四海一!千年血统
网友评论