概述
正则表达式元字符:
字符匹配 :
.
:除换行符以外的任意单个字符
[]
:指定范围内字符
[^]
:指定范围外字符
次数匹配:
*
:任意次,0,1,多次
.*
:任意字符 任意次
?
:至多1次或0次
+
:至少出现1次或多次
{m}
:其前面字符出现m次
{m,n}
:其前面字符出现至少m次,至多n次
{m,}
:其前面字符出现至少m次
{,n}
:其前面字符出现至多n次
位置锚定:
^
:匹配字符串的开头
$
:匹配字符串的末尾
分组及引用:
()
:分组,括号内模式会被记录于正则表达式引擎
后向引用 :1
2
3.....
或:
a|b
:a或者b
C|cat
:C或cat
(C|c)at :Cat或cat
转义字符:
w
:匹配字母数字
W
:匹配非字母数字
s
:匹配任意空白字符,等价于 [tnrf].
S
:匹配任意非空字符
d
:匹配任意数字,等价于 [0-9].
D
:匹配任意非数字
A
:匹配字符串开始
Z
:匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
z
:匹配字符串结束
G
:匹配最后匹配完成的位置。
b
:匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B
:匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
n
:匹配一个换行符
t
:匹配一个制表符
1...9 :匹配第n个分组的子表达式
小练习:
判断手机号码是否合法
根据手机号码一共11位并且是只以13、14、15、17、18开头的数字:
import re phone_number = input('please input your phone number : ') if re.match('^(13|14|15|17|18)[0-9]{9}$',phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')
匹配标签
import re ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") #还可以在分组中利用?<name>的形式给分组起名字 #获取的匹配结果可以直接用group('名字')拿到对应的值 print(ret.group('tag_name')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致 #获取的匹配结果可以直接用group(序号)拿到对应的值 print(ret.group(1)) print(ret.group()) #结果 :<h1>hello</h1>
爬虫练习
import requests import re import json def getPage(url): response=requests.get(url) return response.text def parsePage(s): com=re.compile('<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',re.S) ret=com.finditer(s) for i in ret: yield { "id":i.group("id"), "title":i.group("title"), "rating_num":i.group("rating_num"), "comment_num":i.group("comment_num"), } def main(num): url='https://movie.douban.com/top250?start=%s&filter='%num response_html=getPage(url) ret=parsePage(response_html) print(ret) f=open("move_info7","a",encoding="utf8") for obj in ret: print(obj) data=json.dumps(obj,ensure_ascii=False) f.write(data+"n") if __name__ == '__main__': count=0 for i in range(10): main(count) count+=25
import re import json from urllib.request import urlopen def getPage(url): response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): com = re.compile( '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) ret = com.finditer(s) for i in ret: yield { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num"), } def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num response_html = getPage(url) ret = parsePage(response_html) print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = str(obj) f.write(data + "n") count = 0 for i in range(10): main(count) count += 25
转载于:https://www.cnblogs.com/qinxin1/p/10336333.html
最后
以上就是爱笑秋天为你收集整理的python_正则_re模块的全部内容,希望文章能够帮你解决python_正则_re模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复