• python正则表达式解析(re)


    正则表达式的使用方法主要有4种: re.search(进行正则匹配), re.match(从头开始匹配)  re.findall(找出所有符合条件的字符列表)  re.split(根据条件进行切分)  re.sub(根据条件进行替换)

    匹配规则里的符号

    # . 可以被当作任意字符, re.M 忽略开头的换行符

    res = re.match('^c.+d', 'cheng123ronghua', flags=re.M)
    print(res)

    # ^ 匹配当前字符串的开头, ^c表示已c开头,a$以a为结尾

    res = re.search('^c[a-z]+a$', 'cdasda')
    print(res.group())

    # $ 表示结尾

    res = re.search('r[a-zA-Z]+a$', 'cheng321ronGHua123aronghua')
    print(res.group())

    # * 表示匹配0个或者多个

    print(re.findall('ab*', 'alexabbtomab'))
    
    # ['a', 'abb', 'ab']

    # + 表示匹配一个或者多个

    print(re.findall('xd+a', 'alex123abc'))
    
    # ['x123a']

    # ? 匹配0个或者一个

    print(re.findall('宋惠乔?', '宋惠 宋惠乔'))
    
    # ['宋惠', '宋惠乔']

     # {1,3} 匹配一个到三个之间

    print(re.findall('[0-9]{1,3}', 'alex123alex1alex12'))
    
    # ['123', '1', '12']

    # | 进行或操作的匹配,匹配其中一个即可

    print(re.search('abc|ABC', 'abcABCCD').group())
    
    # abc

    # 将需要匹配的字母进行统一的保存

    string = re.search('(abc){2}(||=){2}', '123abcabc||=||=')
    print(string.group())
    
    # abcabc||=||=

    # A 表示以什么开头, 相当于上面的^ 

    print(re.search('Aa.+b', 'a123b').group())
    
    # a123b

    #  表示以什么结尾,相当于上面的$ 

    print(re.search('b.+d', '11b23d').group())
    
    # b23d

    # D 匹配非数字

    print(re.search('D+', '123$-a').group())
    
    # $-a

    # w 匹配数字或者字母

    print(re.search('w+ow+', 'the old tsoms').group())
    
    # tsoms

    # W 匹配非数字或者字母

    print(re.search('W+', 'abc123%-%-%abc').group())
    
    # %-%-%

    # s 匹配空包字符  

    print(re.findall('s+', 'sd 
     sd'))
    
    # [' 
     ']

    # (?P<>[]+) 进行分组构造字典

    A = re.search('(?P<id>[0-9]+)(?P<name>[a-z]+)', '123alex')
    print(A.groupdict())
    
    # {'id': '123', 'name': 'alex'}

    # re.split() 进行数据切分

    print(re.split('[ ]+', '123  123 12'))
    
    # ['123', '123', '12']

    # re.sub 表示将数字进行替换| 

    print(re.sub('[0-9]+', '|', 'acv1dae2dasd3ads'))
    
    # acv|dae|dasd|ads

    # 进行反斜杠匹配 r'\'

    print(re.split(r'\', r'abc123'))
    
    # ['abc', '123']

    # re.I 忽略大小写

    print(re.search('[a-z]+', 'abcA', re.I).group())
    
    # abcA

    # re.M 忽略开头的

    print(re.search('^d123', '
    d123456', flags=re.M).group())
    
    # d123

    # re.S 匹配所有的字符串,包括换行符

    print(re.findall(r'd.+s', 'd123
    
    s123', flags=re.S))
    
    # ['d123
    
    s']

    这里编写了一个简单的计算器 

    import re
    
    s = '1-2*((60-30 +(9-2*5/3+7/3*99/4*2998+10*568/14)*(-40 / 5))-(-4*3)/(16-3*2))'
    s = s.replace(' ', '')
    print(eval(s))
    def get_grap(string):
    
        x = re.compile('([^()]+)').search(string)
        if x == None:
            return string
        else:
            return x.group()
    
    
    def cal(x):
        if '*' in x:
            return float(x.split('*')[0]) * float(x.split('*')[1])
        else:
            return float(x.split('/')[0]) / float(x.split('/')[1])
    
    def cal_sum(x):
        if '+' in x :
            return float(x.split('+')[0]) + float(x.split('+')[1])
        elif '-' in x:
            return float(x.split('-')[0]) - float(x.split('-')[1])
    
    def cal_grap(x):
        # 找出其中的乘和除
        while True:
            y = re.compile('d+(.d+)?[*/]-?d+(.d+)?').search(x)
            if y == None:
                break
            y = y.group()
            x = x.replace(y, str(cal(y)))
        #找出其中的加减操作
        while True:
            if re.search('[+][-]', x) != None:
                 x = re.sub('[+][-]', '-', x)
            elif re.search('[-][-]', x) != None:
                 x = re.sub('[-][-]', '+', x)
    
    
            y = re.compile('-?d+(.d+)?[+-]d+(.d+)?').search(x)
            if y == None:
                break
            y = y.group()
            x = x.replace(y, str(cal_sum(y)))
    
        return x
    
    
    while True:
        if re.compile('d+(.d+)?').search(s) != None:
            if re.compile('d+(.d+)?').search(s).group() == s:
                break
    
        x = get_grap(s)
        if re.search('(.+)', x) != None:
            all = cal_grap(x)[1:-1]
        else:
            all = cal_grap(x)
        s = s.replace(x, all)
    
    print(s)
  • 相关阅读:
    Socket网络编程--简单Web服务器(4)
    GCC学习笔记
    字符分隔符'1'(u0001)的困惑
    g++编译时遇到问题undefined reference to
    ROS学习笔记(三)
    cJSON笔记
    ROS学习笔记(二)
    ROS学习笔记(一)
    ffmpeg推流方式采用TCP协议
    Android OS的image文件组成
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/11475109.html
走看看 - 开发者的网上家园