#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