#13838389438
#是数字
#11位
#以13|15|17|18|16|14
# num = input('phone_number : ')
# if num.isdigit() and len(num) == 11 and num.startswith('13') or \
# num.startswith('14') or \
# num.startswith('15') or \
# num.startswith('17') or \
# num.startswith('18'):
# print('是一个格式正确的电话号码')
# import re # phone_number = input('please input your phone number : ') # if re.match('^(13|14|15|18)[0-9]{9}$',phone_number): # print('是合法的手机号码') # else: # print('不是合法的手机号码')
#正则 —— 通用的,处理 字符串
#正则表达式
#正则 是一种 处理文字 的 规则
#给我们提供一些规则,让我们从杂乱无章的文字中提取有效信息
#模块
#它只是我们使用python去操作一些问题的工具而已,和要操作的这个东西本身是两件事情
#re模块 —— python使用正则
#正则规则
#需要记忆的特别多:两大类
#[字符组] []里面的所有元素只能约束一个元素
#表示在一个字符的位置可以出现的所有情况的集合就是一个字符组
#表示数字的字符组:
#[13456782] #[0123456789]
#[0-9]
#[2-8]
#简写模式必须由小到大
#表示字母的字符组
#[abcd]
#[a-z]
#[A-Z]
#表示匹配任意字符 : [\w\W][\d\D][\S\s]
#正则匹配:字符 量词 非贪婪标志
# 字符:字符、字符组、元字符 表示一个字符位置上可以出现的内容
#身份证号
# 15:首位不能为零,数字组成
# 18:首位不能为零,前17位是数字,最后一位可以是数字或者x
# print(r'\n')
#表示取消字符串内所有转译符的转译作用 real
# print('\n')
#'\'转译符,n,加上转译符 \n --> 换行了
# print(" ")
# print('\\n')
#'\'转译符,n,加上转译符 \n --> 换行了
输出: \n
\n #结论就是:在工具里什么样,挪到python里加个r
#在在线工具中能执行,放到Python的字符串中,表示成r''就可以正常的执行了
findall: import re ret = re.findall("a",‘eva egon yuan’) #返回所有满足匹配条件的结果,放在列表里 #ret = re.findall(正则表达式,需要处理的字符串) # print(ret) #结果 : ['a', 'a'] import re # ret = re.findall(r'\d', 'eva7 egon yuan') # print(ret) import re # ret = re.findall(r'a\b', 'eva egon yuan') # print(ret)
search: import re ret = re.search('a', 'eva egon yuan').group() print(ret) #search从左到右依次找,找到一个就回来,需要使用group()获取返回值 import re ret = re.search('b', 'eva egon yuan') print(ret) #如果re.search找不到,就返回None。使用group会报错 最常用: # ret = re.search('a', 'eva egon yuan') # if ret: # print(ret.group())
match: import re # ret = re.match('a', 'ava egon yuan') #从头开始匹配,就是匹配每个单词的开头。 # print(ret) # print(ret.group()) #match从头开始匹配,匹配上了需要使用group来获取返回值 #匹配不上返回None,这时候使用group会报错 match跟search相似度极高,都是找不到就返回None,这时候使用group会报错
split: import re # 'a,b'.split(',') #[a,b] # ret = re.split('[ac]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 # print(ret) # ['', 'b', 'd']
sub: import re # ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) #replace(old,new,count) # #sub(re,new,str,count) # print(ret) subn: # ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次) # print(ret)
compile:(编译) import re # obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 # ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 # print(ret.group()) #结果 : 123 # ret = re.search('\d{3}','abc123eeee').group() # print(ret) # 效果跟上种方法相同,用的时间多,比不上上种方法
finditer:(相比findall节省内存) # re.findall() #返回所有满足匹配条件的结果,放在列表里[] ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> for i in ret: print(i.group()) # print(next(ret).group()) #查看第一个结果 # print(next(ret).group()) #查看第二个结果 # print([i.group() for i in ret]) #查看剩余的左右结果
findall:找所有,返回列表
search:找第一个,返回值.group()才能取值
match:从字符串带头匹配,返回值.group()
split:根据正则表达式去切割
sub/subn:根据正则表达式去替换
compile:编译正则
finditer:找所有,返回迭代器,取值需要for,结果需要group
# findall: # import re # ret = re.findall("a",'eva egon yuan') # # ret = re.findall() # print(ret) # from collections import defaultdict # # import sys # print(sys.platform) # import re # ret = re.findall(r'www\.baidu\.com|www\.oldboy\.com', r'www.baidu.com') # print(ret) # import re # ret = re.findall(r'www\.(baidu|oldboy)\.com', r'www.baidu.com') # findall取组内 # print(ret) # import re # ret = re.findall(r'www\.(?:baidu|oldboy)\.com',r'www.baidu.com') # #findall取组所有匹配的 # print(ret)
import re ret = re.search(r'www\.(?P<web_name>baidu|oldboy)\.com', r'www.baidu.com').group('web_name') #search取组内 print(ret) ret = re.search(r'www\.(?P<web_name>baidu|oldboy)\.com',r'www.baidu.com').group() #search取全组 print(ret) ret = re.search(r'www\.(baidu|oldboy)\.com',r'www.baidu.com').group() #search取全组 print(ret)
# ret=re.split("\d+","eva3egon4yuan") # print(ret) #结果 : ['eva', 'egon', 'yuan'] # # ret=re.split("(\d+)","eva3egon4yuan") # print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] # import re # ret = re.search("<\w+>\w+</\w+>", "<h1>hello</h1>") # print(ret.group()) #结果 :<h1>hello</h1> # import re # ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") # print(ret.group('tag_name')) #结果 :h1
匹配整数:
import re ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret)
所有都被匹配出来
import re ret = re.findall(r"\d+\.\d+|\d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret)
不取浮点数
import re ret = re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) ret.remove('') print(ret)
爬豆瓣网:
import re from urllib.request import urlopen def getPage(url): response = urlopen(url) #bytes 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