zoukankan      html  css  js  c++  java
  • python开发模块基础:re正则

    一,re模块的用法

    #findall  #直接返回一个列表
    #正常的正则表达式
    #但是只会把分组里的显示出来
    #search #返回一个对象 .group()
    #match #返回一个对象 .group()
     1 import re
     2 #re模块的用法
     3 
     4 ret = re.findall('a', 'eva egon yuan')  # 返回所有满足匹配条件的结果,放在列表里
     5 print(ret) #结果 : ['a', 'a']
     6 
     7 ret = re.search('a', 'eva egon yuan').group()
     8 print(ret) #结果 : 'a'
     9 # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    10 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    11 
    12 ret = re.match('a', 'abc').group()  # 同search,不过尽在字符串开始处进行匹配
    13 print(ret)
    14 #结果 : 'a'
    15 
    16 ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    17 print(ret)  # ['', '', 'cd']
    18 
    19 ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
    20 print(ret) #evaHegon4yuan4
    21 
    22 ret = re.subn('d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
    23 print(ret)
    24 
    25 obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    26 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    27 print(ret.group())  #结果 : 123
    28 
    29 import re
    30 ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    31 print(ret)  # <callable_iterator object at 0x10195f940>
    32 print(next(ret).group())  #查看第一个结果
    33 print(next(ret).group())  #查看第二个结果
    34 print([i.group() for i in ret])  #查看剩余的左右结果
    35 
    36 #注意:
    37 #1 findall的优先级查询
    38 import re
    39 
    40 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    41 print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    42 
    43 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    44 print(ret)  # ['www.oldboy.com']
    45 
    46 #2 split的优先级查询
    47 ret=re.split("d+","eva3egon4yuan")
    48 print(ret) #结果 : ['eva', 'egon', 'yuan']
    49 
    50 ret=re.split("(d+)","eva3egon4yuan")
    51 print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
    52 
    53 #在匹配部分加上()之后所切出的结果是不同的,
    54 #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    55 #这个在某些需要保留匹配部分的使用过程是非常重要的。
    56 
    57 #findall  #直接返回一个列表
    58     #正常的正则表达式
    59     #但是只会把分组里的显示出来
    60 
    61 #search   #返回一个对象 .group()
    62 #match    #返回一个对象 .group()

    练习题

     1 #!/usr/bin/python env
     2 #_*_coding:utf-8_*_
     3 
     4 #1、匹配标签
     5 import re
     6 ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
     7 #还可以在分组中利用?<name>的形式给分组起名字
     8 #获取的匹配结果可以直接用group('名字')拿到对应的值
     9 print(ret.group('tag_name'))  #结果 :h1
    10 print(ret.group())  #结果 :<h1>hello</h1>
    11 
    12 ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>")
    13 #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致
    14 #获取的匹配结果可以直接用group(序号)拿到对应的值
    15 print(ret.group(1))
    16 print(ret.group())  #结果 :<h1>hello</h1>
    17 
    18 #2、匹配整数
    19 import re
    20 ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
    21 print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
    22 ret=re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")
    23 print(ret) #['1', '-2', '60', '', '5', '-4', '3']
    24 ret.remove("")
    25 print(ret) #['1', '-2', '60', '5', '-4', '3']
    26 
    27 #3、数字匹配
    28 # 1、 匹配一段文本中的每行的邮箱
    29 #       http://blog.csdn.net/make164492212/article/details/51656638
    30 # 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
    31 #
    32 #    分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
    33 #    一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
    34 # 3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}
    35 # 4、 匹配一个浮点数。       ^(-?d+)(.d+)?$   或者  -?d+.?d*
    36 # 5、 匹配汉字。             ^[u4e00-u9fa5]{0,}$
    37 # 6、 匹配出所有整数

    爬豆瓣网页匹配

     1 #!/usr/bin/python env
     2 #_*_coding:utf-8_*_
     3 import re
     4 import json
     5 import requests  #urlopen
     6 
     7 def getPage(url):
     8     response = requests.get(url)
     9     return response.text
    10 
    11 def parsePage(s):
    12     com = re.compile(
    13         '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
    14         '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
    15 
    16     ret = com.finditer(s)
    17     for i in ret:
    18         yield {
    19             "id": i.group("id"),
    20             "title": i.group("title"),
    21             "rating_num": i.group("rating_num"),
    22             "comment_num": i.group("comment_num"),
    23         }
    24 
    25 def main(num):
    26     url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    27     response_html = getPage(url)
    28     ret = parsePage(response_html)
    29     print(ret)
    30     f = open("move_info7", "a", encoding="utf8")
    31 
    32     for obj in ret:  #循环生成器
    33         print(obj)
    34         data = json.dumps(obj, ensure_ascii=False)
    35         f.write(data + "
    ")
    36 
    37 count = 0
    38 for i in range(10):
    39     main(count)
    40     count += 25
  • 相关阅读:
    java之设计模式
    java关键字volatile用法详解
    java关键字tranisent用法详解
    java关键字final用法详解
    java关键字static用法详解
    护眼纯黑色VS2012配色方案
    (正能量)进击的菜鸟
    13、python实现罗马数字转整数
    python判断回文数-leetcode算法
    正确显示中文标签和正负号
  • 原文地址:https://www.cnblogs.com/jokerbj/p/7327894.html
Copyright © 2011-2022 走看看