Python模块----正则表达式

正则表达式

一、元字符:

 ' . ' 代表通配符,可以匹配到所有但是匹配不到 '\n'
 ' ^ '   代表在字符串开头匹配,在中括号里的意思是非,后面全部为非 
 ' $ ' 代表字符串结尾是匹配
' * ' 匹配前面紧挨的字符,该字符可以出现多次(0--n)
' ? ' 匹配前面紧挨的字符0或1次
' | ' 代表或 
 ' + ' 匹配前面紧挨的字符1--n次(贪婪匹配)
' { } ' 自定义匹配前面紧挨的字符出现次数   {0,} == ' * '   {0,1} == ' ? '  {1,} == '+'
' [ ] '  匹配括号里面的内容或的关系选出1个,没有特殊字符,不需要转义
 ' () ' 代表分组  ------->  有名分组 :(?P<表签名>\w+)   前面固定的写法,后面正则匹配规则.   --->(?:表达式)  写在括号里代表去优先级
‘ \ ’ 代表转义字符

  转义字符的其他用法

                           \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  匹配一个特殊字符边界,比如空格 ,&,#等

tips:在正则表达式里'\\' 代表一个'\',  每一个就需要匹配'\'  的需要4个'\'来进行匹配,因为操作系统两个'\\' 相当于'\',正则里面也是如此,正则式建立在操作系统之上,所以需要4个‘\’

二、re模块的用法

import re

# re.findall('匹配规则', '匹配字符串') 
print(re.findall('csdn', 'asdacsdn546csdnads+'))  #  将匹配结果放到列表中返回
>>> ['csdn', 'csdn']

# re.finditer('匹配规则', '匹配字符串')
print(re.finditer('csdn', 'asdacsdn546csdnads+')) #  将匹配结果放到迭代器中,节省内存
>>> <callable_iterator object at 0x0000029DA17BE160>

#re.sub(替换字符串,新字符,字符串,[前几次])
print(re.sub('1234','csdn', '1234'))   #  替换字符串
>>> csdn

# re.subn(替换字符串,新字符,字符串)  
print(re.subn('1234','csdn', '1234'))  #  替换字符串,将匹配结果和次数元组返回
>>> ('csdn', 1)

# re.match(匹配规则,  匹配目标)  #  只能在开头匹配
print(re.match('1234',  '1234'))  #  返回为一个对象,只能在开头匹配
print(re.match('1234',  '1234').group())   # 加上group才能打印出值
>>><_sre.SRE_Match object; span=(0, 3), match='123'>
>>> 1234

# re.split(匹配规则,  匹配目标)      
print(re.split('[ab]','abc'))   分割
>>>['','','c']    先按括号里的分,分完后左边没有就是空,右边继续分

#re.serach(匹配规则,  匹配目标) 
print(re.search('123','123'))  #  返回为一个对象,只会找到第一个匹配成功的. 
print(re.search('123','123').group())
>>> <_sre.SRE_Match object; span=(0, 3), match='123'>
>>> 123

# re.compile('匹配规则')  
com = re.compile('123')
print(com.findall('123'))  #  编辑   通过compile去调用其他的方法,就不用写规则
>>> 123

# 其他的姿势
print(re.search('(?P<name>\w)', '123').group('name'))  # 前面写好的标签名,后面group调用
>>> 1

小项目  :计算器       

import re


def none(value):
    for item in ['\*', '\/', '\%', '\+', '\-']:
        while 1:
            #  检验是否符合表达式
            aim = re.search('(\d+){}(\d+)'.format(item), value)
            if aim:
                new = item.lstrip('\\')
                if new == '*':
                    result = int(aim.group(1)) * int(aim.group(2))
                if new == '+':
                    result = int(aim.group(1)) + int(aim.group(2))
                if new == '-':
                    result = int(aim.group(1)) - int(aim.group(2))
                if new == '/':
                    result = int(aim.group(1)) / int(aim.group(2))
                if new == '%':
                    result = int(aim.group(1)) % int(aim.group(2))
                #  因为正则不认识'*',所以加'\'
                a = aim.group(1) + item + aim.group(2)
                value = re.sub(a, str(result), value)
            else:
                break
    return str(value)


def not_none(value):
    while 1:
        aim = re.search('\([^()]*\)', value)
        if aim:
            # 将取出来的值去括号
            raw = aim.group(0).lstrip('(').rstrip(')')
            res = none(raw)
        else:
            break
        # 替换字符串
        value = value.replace(aim.group(0), res)
        # value = re.sub(raw, res, value)
    result = none(value)
    return result


def sort(value):
    # 判断算式有没有括号
    if re.search('\(', value):
        result = not_none(value)
        print(result)
    else:
        result = none(value)
        print(result)


def proof(value):
    #  检验括号是否成对
    left = len(re.findall('\(', value))
    right = len(re.findall('\)', value))
    if left != right:
        print('error')
        return False
    #  验证没有字母出现
    if len(re.findall('[a-zA-Z]+', value)) != 0:
        print('error')
        return False
    #  验证没有运算符的输入错误
    if len(re.findall('([+*-/%])+([+*-/%])+', value)) != 0:
        print('error')
        return False
    #  防止有空格插入
    new_value = value.replace(' ', '')
    return new_value


def main():
    value = input('please input')
    new_value = proof(value)
    sort(new_value)


if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/weixin_41678001/article/details/81943024
今日推荐