一、python正则简介

python的re模块,让python能够支持perl正则

perl正则的字符集("."  "[abc]"   "(abc)"  "a|b")、锚点("$"  "^"  "\<\>")、修饰字符("*"  "?"  "+"  "{}")  这里不做介绍

二、re模块中的函数,主要是三种匹配(match、search、findall)、一种替换(sub)、一种分割(split)

3种匹配之间比较:

1,match、search如果匹配到内容则返回一个对象(MatchObject对象),否则返回None,findall返回一个列表(包括空列表)

2,使用group()和groups()方法访问MatchObject对象

3,match只能匹配行首的pattern,search能够匹配非行首的pattern

3种匹配的第3个参数用法:

flags被指定为一个可选的标志。多个标志可以通过按位 OR(|) 来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

1,match(apttern,string,flags=0)

flag:标志位,用来控制match的匹配方式,一般都没有指定,默认0

match用来从起始位置开始根据模型去字符串中匹配指定内容,如果没有匹配到内容,会返回None  如果匹配到内容  会返回一个MatchObject的对象

使用group()和groups()方法访问匹配的内容

import re
string="1234erqwe123"

obj=re.match('\d+',string)      #返回一个对象
print(obj)
print(obj.group())     #使用group()方法访问匹配的内容

#<_sre.SRE_Match object; span=(0, 4), match='1234'>
#
import re
string="@$1234erqwe123"
obj1=re.match('([^0-9]+)(\d+)',string)

print(obj1.group())       #group()返回一个字符串
print(obj1.groups())     #groups()返回一个元组

#@$1234
#('@$', '1234')

2,search(pattern, string, flags=0)

search和match就一处区别,可以匹配非行首的pattern,也是通过group()和groups()访问匹配到的数据

string="#$1234erqwe123"
obj=re.search('(\d+)([^0-9]+)',string)

print(obj.group())
print(obj.groups())

#1234erqwe
#('1234', 'erqwe')

3,findall(pattern,string,flags=0)

match和search只能匹配一个pattern ,如果想匹配字符串中所有符合要求的pattern   ,使用findall()

findall函数返回一个列表

import re
string="#$1234erqwe123"
obj=re.findall('\d+',string)       #findall函数返回一个列表
print(obj)

#['1234', '123']

4,sub(pattern,repl,string,n=0)

sub用于替换指定的字符串 ,比字符串方法replace功能丰富

import re
string="1234erqwe123adfa123"
new_string=re.sub('\d+','**',string)          #返回替换后的副本,原字符串不变
new_string2=re.sub('\d+','**',string,2)       #可指定替换前n个pattern,后面的不替换
print(string)
print(new_string)
print(new_string2)

#1234erqwe123adfa123
#**erqwe**adfa**
#**erqwe**adfa123
sub函数的第二个参数,可以是字符串,也可以是函数这个链接有详细解释当sub函数的第二个参数是字符串时,可以使用 "\\1"  r"\1"  "\g<1>"  "\g<name>"   反向引用当sub函数的第二个参数是函数时,pattern每匹配到一个实例,就会传一个MatchObject对象给函数,函数的返回值,就是要"替换成"的内容

5,split(pattern,string,n)split用于按指定匹配切割字符串,n表示按前n个pattern分割,如果n为空则表示按所有的pattern切割,返回一个列表split函数比字符串方法split功能丰富
import re
string="1234erqwe123adfa123"
new_string=re.split('\d+',string,1)       #以前1个pattern为分割符
new_string1=re.split('\d+',string,2)      #以前2个pattern为分割符
new_string2=re.split('(\d+)',string,1)    #如果pattern中带有括号,括号里面的内容会返回
new_string3=re.split('(\d+)',string,2)    #
print(new_string)
print(new_string1)
print(new_string2)
print(new_string3)

#['', 'erqwe123adfa123']
#['', 'erqwe', 'adfa123']
#['', '1234', 'erqwe123adfa123']
#['', '1234', 'erqwe', '123', 'adfa123']
三、python应用示例---计算器#主要使用到正则函数、迭代、字符串格式化
import re

def chengfa_chufa(string):
    if not re.findall('\*|/',string):
        return string
    expression_list=re.split('([+-]?[0-9.]+[*/][+-]?[0-9.]+)',string,1)
    number_list=re.split('([*/])',expression_list[1],1)
    left_number=float(number_list[0])
    right_number=float(number_list[2])
    if number_list[1]=='*':
        result=left_number*right_number
    else:
        result=left_number/right_number
    if result>0:
#        result='+'+str(result)
        result='%s%s' %('+',result)
#    string_new=expression_list[0]+str(result)+expression_list[2]
    string_new='%s%s%s' %(expression_list[0],result,expression_list[2])
    if re.findall('\*|/',string_new):
        return chengfa_chufa(string_new)
    else:
#        print(string_new)
        return string_new

#-2+3-4+6.7
def jiafa_jianfa(string):
    string=string.replace('+-','-').replace('-+','-').replace('++','+').replace('--','+')
    expression_list=re.split('([-+][0-9.]+)',string)
    result=0
    for i in expression_list:
        if i :
            num=float(i)
            result=result+num
    return result

def main(string):
    if not re.findall('\(|\)',string):
        return jiafa_jianfa(chengfa_chufa(string))
    expression_list=re.split('\(([^)(]+)\)',string,1)
    result=jiafa_jianfa(chengfa_chufa(expression_list[1]))
#    string_new=expression_list[0]+str(result)+expression_list[2]
    string_new='%s%s%s' %(expression_list[0],result,expression_list[2])
    if re.findall('\(|\)',string_new):
        return main(string_new)
    else:
        return jiafa_jianfa(chengfa_chufa(string_new))

if __name__=='__main__':
    string=input('input expression: ')
    result=main(string)
    print(result)

python基础知识---正则的更多相关文章

  1. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  2. python基础知识(二)

    以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍

  3. python 基础知识(一)

    python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...

  4. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. python 爬虫与数据可视化--python基础知识

    摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...

  7. python基础知识小结-运维笔记

    接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...

  8. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

  9. Python基础知识(Basic knowledge)

    Python基础知识(Basic knowledge) 1.认识Python&基础环境搭建 2.Python基础(上) 3.Python基础(中) 4.Python基础(下) 5.Python ...

随机推荐

  1. python3.5学习笔记:linux6.4 安装python3 pip setuptools

    前言: python3应该是python的趋势所在,当然目前争议也比较大,这篇随笔的主要目的是记录在linux6.4下搭建python3环境的过程 以及碰到的问题和解决过程. 另外,如果本机安装了py ...

  2. C++中vector的remove用法

      我将从remove的复习开始这个条款,因为remove是STL中最糊涂的算法.误解remove很容易,驱散所有关于remove行为的疑虑——为什么它这么做,它是怎么做的——是很重要的. 这是rem ...

  3. Hibernate5.2关联关系之双向一对多(三)

                                                           Hibernate之双向一对多(三) 一.简介 本篇博文接着上一章的内容接着开展,代码也是 ...

  4. 扩展ValidationAttribute 1

    MVC中经常会用一些服务端对Model的验证. 服务端验证要继承自ValidationAttribute,并重写IsValid虚方法来自定义自己的验证规则. protected override Va ...

  5. SparkStreaming(源码阅读十二)

    要完整去学习spark源码是一件非常不容易的事情,但是咱可以积少成多嘛~那么,Spark Streaming是怎么搞的呢? 本质上,SparkStreaming接收实时输入数据流并将它们按批次划分,然 ...

  6. 在sql脚本中获取变量中的查询结果

    )--变量 ) set @itemValue='select @a=getdate()'--赋值 exec sp_executesql @itemValue,N'@a nvarchar(max) ou ...

  7. 使用compass编译sass

    1.初始化项目 compass create test(项目名称),会在当前目录下创建test子目录,test的子目录下有config.gb文件,sass和stylesheets文件夹. 2.编写sa ...

  8. Oracle 游标示例,带异常处理

    Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ F ...

  9. 浏览器缓存相关的Http头介绍:Expires,Cache-Control,Last-Modified,ETag

    转自:http://www.path8.net/tn/archives/2745 缓存对于web开发有重要作用,尤其是大负荷web系统开发中. 缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中 ...

  10. *按类的某一字段排序(Lv)

    给定一个student类,类中有两个属性ID,Score.对一组student类对象排序,写出方法.