1,正则表达式

正则表达式,就是匹配字符串内容的一种规则。

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

字符组 : [字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示
字符分为很多类,比如数字、字母、标点等等。
假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。

字符组只能匹配一个元素。字符组代表一个字符位置上可以出现的所有内容。范围是根据asc码来的,范围必须是从小到大的指向,一个字符组可以有多个范围。

  1. [0-9] 匹配09的整数
  2. [1-9][0-9][0-9] 匹配三位数
  3. [a-z]小写字母
  4. [A-Z]大写字母
  5. [A-Za-z]大小写字母
  6. [0-9a-fA-F]用来验证16进制字符

字符:在正则表达式中有特殊意义。

  1. . 点匹配除换行符(enter)回车键以为的任意字符
  2. \w 匹配字母数字或下划线
  3. \s 匹配任意的空白符
  4. \d 匹配数字
  5. \t 匹配一个制表符
  6. \n 匹配一个换行符
  7. \b 匹配一个单词的结尾
  8. ^ 匹配字符串的开始
  9. $ 匹配字符串的结尾
  10. \W 匹配非字母数字或下划线
  11. \D 匹配非数字
  12. \S 匹配非空白符
  13.  
  14. [\s\S]
  15. [\W\w]
  16. [\d\D]
  17. 全局匹配
  18. a|b 匹配字符a或字符b
  19. ()匹配括号内的表达式,也表示一个组。
  20. [....]匹配字符组中的字符
  21. [^...]匹配除了字符组中字符的所有字符

量词:

  1. * 重复零次或者多次
  2. + 重复一次或者多次
  3. ?重复零次或者一次
  4. {n},重复n次,表示具体的次数
  5. {n,}重复n次或者更多次
  6. {n,m}重复nm

量词只约束前一个字符:

  1. *? 重复任意次,但尽可能少重复
  2. +? 重复1次或更多次,但尽可能少重复
  3. ?? 重复0次或1次,但尽可能少重复
  4. {n,m}? 重复nm次,但尽可能少重复
  5. {n,}? 重复n次以上,但尽可能少重复

.*?的用法

  1. . 是任意字符
  2. * 是取 0 无限长度
  3. ? 是非贪婪模式。
  4. 何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
  5. .*?x
  6.  
  7. 就是取前面任意长度的字符,直到一个x出现

转义符\

在正则表达式中,有很多有特殊意义的是元字符,比如\d和\s等,如果要在正则中匹配正常的"\d"而不是"数字"就需要对"\"进行转义,变成'\\'。

在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\d",字符串中要写成'\\d',那么正则里就要写成"\\\\d",这样就太麻烦了。这个时候我们就用到了r'\d'这个概念,此时的正则是r'\\d'就可以了。

2,re模块

re 模块下常用方法:

  1. import re
  2.  
  3. ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
  4. print(ret) #结果 : ['a', 'a']
  5.  
  6. ret = re.search('a', 'eva egon yuan').group()
  7. print(ret) #结果 : 'a'
  8. # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
  9. # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
  10.  
  11. ret = re.match('a', 'abc').group() # 同search,不过尽在字符串开始处进行匹配
  12. print(ret)
  13. #结果 : 'a'
  14.  
  15. ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
  16. print(ret) # ['', '', 'cd']
  17.  
  18. ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1
  19. print(ret) #evaHegon4yuan4
  20.  
  21. ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
  22. print(ret)
  23.  
  24. obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
  25. ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
  26. print(ret.group()) #结果 : 123
  27.  
  28. import re
  29. ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
  30. print(ret) # <callable_iterator object at 0x10195f940>
  31. print(next(ret).group()) #查看第一个结果
  32. print(next(ret).group()) #查看第二个结果
  33. print([i.group() for i in ret]) #查看剩余的左右结果

1 findall的优先级查询:

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

2 split的优先级查询

  1. ret=re.split("\d+","eva3egon4yuan")
  2. print(ret) #结果 : ['eva', 'egon', 'yuan']
  3.  
  4. ret=re.split("(\d+)","eva3egon4yuan")
  5. print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
  6.  
  7. #在匹配部分加上()之后所切出的结果是不同的,
  8. #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
  9. #这个在某些需要保留匹配部分的使用过程是非常重要的。

匹配标签

  1. import re
  2.  
  3. ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
  4. #还可以在分组中利用?<name>的形式给分组起名字
  5. #获取的匹配结果可以直接用group('名字')拿到对应的值
  6. print(ret.group('tag_name')) #结果 :h1
  7. print(ret.group()) #结果 :<h1>hello</h1>
  8.  
  9. ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
  10. #如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
  11. #获取的匹配结果可以直接用group(序号)拿到对应的值
  12. print(ret.group(1))
  13. print(ret.group()) #结果 :<h1>hello</h1>

匹配整数

  1. import re
  2.  
  3. ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
  4. print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
  5. ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
  6. print(ret) #['1', '-2', '60', '', '5', '-4', '3']
  7. ret.remove("")
  8. print(ret) #['1', '-2', '60', '5', '-4', '3']

数字匹配

  1. 1 匹配一段文本中的每行的邮箱
  2. http://blog.csdn.net/make164492212/article/details/51656638
  3.  
  4. 2 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
  5.  
  6. 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
  7. 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
  8.  
  9. 3 匹配qq号。(腾讯QQ号从10000开始) 1,9][0,9]{4,}
  10.  
  11. 4 匹配一个浮点数。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*
  12.  
  13. 5 匹配汉字。 ^[\u4e00-\u9fa5]{0,}$
  14.  
  15. 6 匹配出所有整数

爬虫练习

  1. import requests
  2.  
  3. import re
  4. import json
  5.  
  6. def getPage(url):
  7.  
  8. response=requests.get(url)
  9. return response.text
  10.  
  11. def parsePage(s):
  12.  
  13. com=re.compile('<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.  
  27. url='https://movie.douban.com/top250?start=%s&filter='%num
  28. response_html=getPage(url)
  29. ret=parsePage(response_html)
  30. print(ret)
  31. f=open("move_info7","a",encoding="utf8")
  32.  
  33. for obj in ret:
  34. print(obj)
  35. data=json.dumps(obj,ensure_ascii=False)
  36. f.write(data+"\n")
  37.  
  38. if __name__ == '__main__':
  39. count=0
  40. for i in range(10):
  41. main(count)
  42. count+=25
  1. import re
  2. import json
  3. from urllib.request import urlopen
  4.  
  5. def getPage(url):
  6. response = urlopen(url)
  7. return response.read().decode('utf-8')
  8.  
  9. def parsePage(s):
  10. com = re.compile(
  11. '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
  12. '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
  13.  
  14. ret = com.finditer(s)
  15. for i in ret:
  16. yield {
  17. "id": i.group("id"),
  18. "title": i.group("title"),
  19. "rating_num": i.group("rating_num"),
  20. "comment_num": i.group("comment_num"),
  21. }
  22.  
  23. def main(num):
  24. url = 'https://movie.douban.com/top250?start=%s&filter=' % num
  25. response_html = getPage(url)
  26. ret = parsePage(response_html)
  27. print(ret)
  28. f = open("move_info7", "a", encoding="utf8")
  29.  
  30. for obj in ret:
  31. print(obj)
  32. data = str(obj)
  33. f.write(data + "\n")
  34.  
  35. count = 0
  36. for i in range(10):
  37. main(count)
  38. count += 25
  39.  
  40. 简化版
  1. flags有很多可选值:
  2.  
  3. re.I(IGNORECASE)忽略大小写,括号内是完整的写法
  4. re.M(MULTILINE)多行模式,改变^和$的行为
  5. re.S(DOTALL)点可以匹配任意字符,包括换行符
  6. re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
  7. re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
  8. re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
  9.  
  10. flags

计算器的作业:实现能计算类似
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

  1. import re
  2. #处理符号用的
  3. def dealwith_symbol(express):
  4. if '--' in express:express = express.replace('--','+')
  5. if '+-' in express:express = express.replace('+-','-')
  6. if '-+' in express:express = express.replace('-+','-')
  7. if '++' in express:express = express.replace('++','+')
  8. return express
  9. #处理乘除法
  10. def mul_div(express):
  11. #a*b a/b
  12. if '*' in express:
  13. a,b = express.split('*')
  14. ret = float(a)*float(b)
  15. elif '/' in express:
  16. a, b = express.split('/')
  17. ret = float(a) / float(b)
  18. return str(ret)
  19.  
  20. # 将没有括号的子表达式中的乘除法先提取出来,再计算加减法
  21. def simplify_express(express_son): #(9-2*5/3)
  22. while True: #取乘除法计算
  23. ret = re.search(r'\d+\.?\d*[*/]-?\d+\.?\d*',express_son) #(9-2*5/3)
  24. if ret:
  25. mul_div_express = ret.group() #2*5
  26. result = mul_div(mul_div_express) #
  27. express_son = express_son.replace(mul_div_express,result,1) #(9-3.3)
  28. express_son = dealwith_symbol(express_son)
  29. else:break
  30. express_son = dealwith_symbol(express_son)
  31. num_lst = re.findall(r'[\+\-]?\d+\.?\d*',express_son) #(-8)
  32. sum = 0
  33. for i in num_lst:
  34. sum += float(i)
  35. return str(sum)
  36.  
  37. # 将表达式中的括号提取出来
  38. def remove_bracket(express):
  39. #\([^\(\)]+\)、\([^\(]+?\)、\([\-\d\+\/\*\.]+\)
  40. while True:
  41. ret = re.search(r'\([^\(\)]+\)',express)
  42. if ret:
  43. express_no_bracket = ret.group() #express_no_bracket: 没有括号的表达式
  44. sum = simplify_express(express_no_bracket)
  45. express = express.replace(express_no_bracket,sum,1)
  46. else:break
  47. return simplify_express(express)
  48.  
  49. e = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
  50. new_express = e.replace(' ','')
  51. result = remove_bracket(new_express)
  52. print(result)
  1. import re
  2. # 1 - 2 * ( (60-30 +(-40/5) * 20) - (-4*3)/ (16-5+3*2) ) 259.58823529412
  3. def main():
  4. while True:
  5. try:
  6. arg = input('请输入计算的表达式:').strip()
  7. counter = calc(arg)
  8. print(counter)
  9. break
  10. except Exception:
  11. print('请重新输入:')
  12. def add(arg):
  13. arg = arg.replace("++", "+").replace("--", "+").replace("+-", "-").replace("-+", "-")
  14. num = re.findall(r"([+\-]?\d+\.?\d*)", arg)#匹配所有的数字
  15. result = 0
  16. for i in num:
  17. result = result + float(i)
  18. return result
  19.  
  20. def mul(arg):
  21. while True:
  22. result = re.split(r"(\d+\.?\d*[\*/][\+-]?\d+\.?\d*)",arg,1)#匹配括号内的乘除法
  23. if len(result) == 3:
  24. bef,cen,aft = result
  25. if "*" in cen:
  26. num1,num2 = cen.split("*")
  27. new_cen = float(num1) * float(num2)
  28. arg = bef +str(new_cen) + aft
  29. elif "/" in cen:
  30. num1,num2 = cen.split("/")
  31. new_cen = float(num1) / float(num2)
  32. arg = bef + str(new_cen) + aft
  33. else:
  34. return add(arg)
  35.  
  36. def calc(arg):
  37. while True:
  38. arg = arg.replace(" ","")
  39. result = re.split(r"\(([^()]+)\)",arg,1)#匹配最里面的括号并且只取括号中的内容
  40. if len(result) == 3:
  41. bef,cen,aft = result
  42. r = mul(cen)
  43. arg = bef + str(r) + aft
  44. else:
  45. return mul(arg)
  46. if __name__ == '__main__':
  47. main()

5-5 re模块 正则表达式的更多相关文章

  1. Python中的re模块--正则表达式

    Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...

  2. 【Python开发】Python之re模块 —— 正则表达式操作

    Python之re模块 -- 正则表达式操作 这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式 ...

  3. sys,os,模块-正则表达式

    # *__conding:utf-8__* """"我是注释""" sys,os模块 import sysimport os pr ...

  4. Python之re模块 —— 正则表达式操作

    这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突, ...

  5. Python re模块 正则表达式

    1 简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...

  6. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  7. re 模块 正则表达式

    re模块(正则表达式)   一.什么是正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它 ...

  8. Python3 re模块(正则表达式)

    一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. (在Python中)它内嵌在Python中,并通过r ...

  9. re模块正则表达式

    regular expression / regex / RE 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 ...

  10. re模块 - 正则表达式 疏理(一)

    在网上总是很难找到令自己比较满意的,关于正则表达式的文章.所以决定自己来总结一波,并配上相应的示例. 正则表达式:定义了规则,用来字符串处理. 用途: 1.匹配 - 符合规则的字符串,则认为匹配了. ...

随机推荐

  1. A1030. Travel Plan

    A traveler's map gives the distances between cities along the highways, together with the cost of ea ...

  2. spring boot下MultipartHttpServletRequest如何提高上传文件大小的默认值

    前言: 上传下载功能算是一个非常常见的功能,如果使用MultipartHttpServletRequest来做上传功能. 不配置上传大小的话,默认是2M.在有些场景,这个肯定不能满足条件. 上传代码: ...

  3. MySQL 之 数据操作

    一  介绍 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT ...

  4. Day23--Python--常用模块02--序列化,configparser

    1. 序列化 把对象打散成bytes或者字符串. 方便存储和传输 序列化 把bytes或者字符串转换回对象. 反序列化 2. pickle(比较重要) 把python中所有的对象都可以转化成bytes ...

  5. java eclipse 安卓环境配置

    adt下载地址   http://www.runoob.com/w3cnote/android-tutorial-eclipse-adt-sdk-app.html  我的云 安卓学习 java htt ...

  6. ngnix FastCGI解析漏洞

    漏洞描述: Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME.当访问http://192.168.1.103/phpin ...

  7. console控制台的小问题

    第一个foo里面应该是123,但是当执行完下面的代码之后,console控制台会自动将里面的内容改成我们修改之后的

  8. css+div基本知识;

    1.居中: <div class="test"></div> css: .test{ margin: auto; //一行中居中: } 2.IE与其他浏览器 ...

  9. str

    print('字符串操作') s='abc DEF hij' print('首字母大写') print(s.capitalize()) print('全大写') print(s.upper()) pr ...

  10. saltstack API(一) 安装并测试

    python3 安装api # 首先安装python3 .tgz cd Python- . ./configure make make install mv /usr/bin/python /usr/ ...