正则表达式:

#正则表达式:1、正则表达式的作用:匹配字符串(字符串提供的方法是完全匹配)
#引入正则表达式的目的是模糊匹配
s='hello world'
print(s.find('ll')) #查找第一个字符出现的索引
ret=s.replace('ll','xx')
print(ret)
print(s.split(' ')) #一个列表以空格分割

import re
ret=re.findall('w\w{2}l','hello world')
print(ret)
ret=re.findall('alex','ndbvijsialexgr') #完全匹配
print(ret)
#特殊功能的元字符:
# . 除了换行符,代指所有的字符,一个.只能代指一个字符
ret=re.findall('w..l','hello world')
print(ret)
# ^ 通配符,只以最开始的位置匹配 $只在最后位置匹配
ret=re.findall('^h...o','hujoohello world')
print(ret)
ret=re.findall('a..x$','dinualex')
print(ret)
# * 重复匹配,0到多次(贪婪匹配)
ret=re.findall('a.*ll','alexlihelloworld') #重复*前面的字符0到多次
print(ret)
ret=re.findall('ab*','fdiabbubuyb')
print(ret)
# + 重复匹配,1到多次
ret=re.findall('a+b','caaaabhg')
print(ret)
# ? 0或1次(惰性匹配)
ret=re.findall('a?b','caaaabbhg') #0个a或1个a
print(ret)
# {} 自定义匹配多少次
ret=re.findall('a{5}b','caaaaabbhg') #0个a或1个a
print(ret)
ret=re.findall('a{1,3}b','caaaaabbhg') #0个a或1个a
print(ret)
#结论:*等于{0,正无穷} +等于{1,正无穷} ?等于{0,1}
#{1,}等价于{1,正无穷}
# 字符集 []
================================================================================
import re
# 字符集 [] 或 取消元字符的特殊功能(\ ^ - 例外)
ret=re.findall('a[cde]x','acxadx')
print(ret)
ret=re.findall('[a-z]','acx')
print(ret)
ret=re.findall('[*,.]','abc*.')
print(ret)
ret=re.findall('[1-9,a-zA-Z]','jrininngn') #匹配所有
print(ret)
# ^ 在[]表示取反
ret=re.findall('[^t,b]','ngb,ttpd')
print(ret)
# \ 反斜杠后边跟元字符去除特殊功能,反斜杠后边跟普通字符实现特殊功能

# \d 匹配任何十进制数,它相当于类[0-9]
# \D 匹配任何非数字字符,它相当于类[^0-9]
# \s 匹配任何空白字符,它相当于类[\t\n\r\f\v]
# \S 匹配任何非空白字符,它相当于类[^ \t\n\r\f\v]
# \w 匹配任何字母数字字符,它相当于类[a-zA-Z0-9]
# \W 匹配任何非字母数字字符,它相当于类[^a-zA-Z0-9]
# \b 匹配一个特殊字符边界,也就是指单词和空格间的位置

print(re.findall('\d{11}','b181838464848491848484848'))
print(re.findall('\sabc','tytt abc'))
print(re.findall('\wabc','cfchjbkabc'))
print(re.findall('\w','cfc abc'))
print(re.findall(r'I\b','I am a LI$ST'))
print(re.findall(r'\bS','I am a LI$ST'))
#只匹配第一个满足条件的内容
ret=re.search('sb','ndfvsbdvsb')
print(ret) #<_sre.SRE_Match object; span=(4, 6), match='sb'>
print(ret.group()) #取出search出的值
ret=re.search('a','agbdb').group()
print(ret)
# \\ 两个\表示一个\
ret=re.findall(r'\\','abbjvn\o')
print(ret)
ret=re.search('\bblow','blow')
print(ret)
#() 分组 |(或两边的内容)
print(re.search('(as)+','njdasnj').group())
print(re.search('(as)|k','njdask6j').group())
#=====================================================
import re
#命名分组
ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew134ttt123/oooo')
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
#=============================================================
#正则表达式的方法
#findall() :所有的结果都返回发哦一个列表里
#search() :返回匹配到的第一个对象(object),对象可以调用group()返回结果
#match() :只在字符串开始匹配。也返回匹配到的第一个对象(object),对象可以调用group()返回结果
ret=re.match('asd','asdjnvvasdj')
print(ret.group())
#split() :
ret=re.split('[j,s]','jlsdjksal')
print(ret)
#sub() :替换
ret=re.sub('a..x','s..b','gfibalexnjnfj')
print(ret)
#compile() :多次使用可以方便
ret=re.findall('\.com','hdfhb.comfvb')
print(ret)
obj=re.compile('\.com')
ret=obj.findall('hdfhb.comfvb.combh')
print(ret)

 

import re
ret=re.search('\([^()]+\)','(1+(2+5)*2)')
print(ret.group()) #(2+5)

#计算器功能

import re
#检测是否有空格
def check_expression(string):
    check_result=True
    if not string.count("(")==string.count(")"):
        print("表达式错误,括号未闭合")
        check_result = False
    if re.findall('[a-z]',string.lower()):
        print('表达式错误,包含非法字符')
        check_result=False

    return check_result
#格式化处理
def format_string(string):
    string = string.replace(' ','')
    string = string.replace('++', '+')
    string = string.replace('--', '+')
    string = string.replace('+-', '-')
    string = string.replace('-+', '-')
    string = string.replace('*+', '*')
    string = string.replace('/+', '/')
    return string

def calc_mul_div(string):
    regular='\d+\.?\d* [*/] [\-]?\d+\.?\d*'
    while re.findall(regular,string):
        expression=re.search(regular,string).group()
        if expression.count('*'):
            x,y=expression.split('*')
            mul_result=str(float(x)*float(y))
            string=string.replace(expression,mul_result)
            string=format_string(string)
        if expression.count('/'):
            x,y=expression.split('/')
            div_result=str(float(x)/float(y))
            string=string.replace(expression,div_result)
            string=format_string(string)
    return string

def calc_add_sub(string):
    #ret1 = re.search('\d+\.?\d* [+-] \d+\.?\d*', s).group()
    add_regular='[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
    sub_regular='[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
    while re.findall(add_regular,string):
        add_list=re.findall(add_regular,string)
        for add_str in add_list:
            x,y=add_str.split('+')
            add_result='+'+str(float(x)+float(y))
            string=string.replace(add_str,add_result)
        string=format_string(string)
    while re.findall(sub_regular,string):
        sub_list=re.findall(sub_regular,string)
        for sub_str in sub_list:
            numbers=sub_str.split('-')
            if len(numbers)==3:
                result=0
                for v in numbers:
                    if v:
                        result-=float(v)
            else:
                x,y=numbers
                result=float(x)-float(y)
            string=string.replace(sub_str,'+'+str(result))
        string=format_string(string)
    return string

source='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
if check_expression(source):
    print('source:',source)
    print('eval result:',eval(source))
    source=format(source)
    print(source)

    while source.count("(")>0:
        strs = re.search('\([^()]*\)', source).group()
        replace_str = calc_mul_div(strs)
        replace_str = calc_add_sub(replace_str)  # (17)'strs[1,-1]'
        source = format_string(source.replace(strs, replace_str[1:-1]))
    else:
        replace_str = calc_mul_div(source)
        replace_str = calc_add_sub(replace_str)
        source=source.replace(source,replace_str)
    print('my result:',source.replace('+',''))

#source: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# eval result: 2776672.6952380957
# 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# my result: 2776672.6952380957