python基础一 day18 认识正则表达式及探索

       

只和字符串有关系

 

 

 

 带上大写就是非

[Ww]什么都能匹配上

        匹配结尾

 

 

 

 

 先规则在量词,量词只约束它紧跟着的规则

import re
# findall
# search
# match

# ret = re.findall('[a-z]+', 'eva egon yuan')
#     # 返回所有满足匹配条件的结果,放在列表里
# print(ret)

# ret = re.search('a', 'eva egon yuan')
# if ret:
#     print(ret.group())
# 从前往后,找到一个就返回,返回的变量需要调用group才能拿到结果
# 如果没有找到,那么返回None,调用group会报错

# ret = re.match('[a-z]+', 'eva egon yuan')
# if ret:
#     print(ret.group())
# match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量。
# 匹配的内容需要用group才能显示
# 如果没匹配上,就返回None,调用group会报错

# ret = re.split('[ab]', 'abcd')
# # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
# print(ret)  # ['', '', 'cd']

# ret = re.sub('d', 'H', 'eva3egon4yuan4',1)
#将数字替换成'H',参数1表示只替换1个
# print(ret) #evaHegon4yuan4

# ret = re.subn('d', 'H', 'eva3egon4yuan4')
# #将数字替换成'H',返回元组(替换的结果,替换了多少次)
# print(ret)

# obj = re.compile('d{3}')
# #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
# print(ret.group())
# ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
# print(ret.group())  #结果 : 123

# import re
# ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
# print(ret)  # <callable_iterator object at 0x10195f940>
# # print(next(ret).group())  #查看第一个结果
# # print(next(ret).group())  #查看第二个结果
# # print([i.group() for i in ret])  #查看剩余的左右结果
# for i in ret:
#     print(i.group())


import re
# ret = re.search('^[1-9](d{14})(d{2}[0-9x])?$','110105199912122277')
# print(ret.group())
# print(ret.group(1))
# print(ret.group(2))

# import re
#
# ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
#
# ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
# print(ret)  # ['www.oldboy.com']

ret=re.split("d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

爬虫的例子:

import re
from urllib.request import urlopen

def getPage(url):
    response = urlopen(url)
    return response.read().decode('utf-8')

def parsePage(s):
    ret = re.findall(
        '<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>',s,re.S)
    return ret

def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    response_html = getPage(url)
    ret = parsePage(response_html)
    print(ret)

count = 0
for i in range(10):   # 10页
    main(count)
    count += 25

# url从网页上把代码搞下来
# bytes decode ——> utf-8 网页内容就是我的待匹配字符串
# ret = re.findall(正则,带匹配的字符串) #ret是所有匹配到的内容组成的列表

注意:

1 findall的优先级查询:

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

2 split的优先级查询

ret=re.split("d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

分组(?P<id>d+) i.group("id")

findall的分组优先,(?:d)取消分组优先

贪婪模式:回溯算法,会一直找,直到不符合条件了,再往回找

非贪婪模式:把?后面的第一条规则拿在手里,去找第一个符合规则的,就停

网址:https://www.cnblogs.com/Eva-J/articles/7228075.html#_label10

原文地址:https://www.cnblogs.com/wang-tan/p/11437181.html