正则表达式的小技巧

时间:2021-02-18 02:40:01
 1、匹配整数或者小数(包括正数和负数)
-?\d+(\.\d+)?
2、匹配年月日日期 格式2018-12-31
[1-9]\d{3}-(0?[1-9]|1[0-2])-([12]\d|3[01]|0?[1-9])
3、匹配qq号 5-12
[1-9]\d{4,11}
4、11位的电话号码
1[3-9]\d{9}
5、长度为8-10位的用户密码 : 包含数字字母下划线
\w{8,10}
6、匹配验证码:4位数字字母组成的
[\da-zA-Z]{4}
7、匹配邮箱地址 邮箱规则
  邮箱规则
  @之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
  @和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
  最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节
  [\w\-.]+@[\da-zA-Z\-]+(\.[\da-zA-Z\-]+)*\.[a-zA-Z\d]{2,6}
8、从类似
<a>wahaha</a>
<b>banana</b>
<h1>qqxing</h1>
<h1>q</h1>
这样的字符串中,
1)匹配出wahaha,banana,qqxing内容。
2)匹配出a,b,h1这样的内容
import re
ret = re.findall('<(.*?)>(.*?)<.*?>','<a>wahaha</a>')
print(ret[0][1])   # wahaha
print(ret[0][0])  # a
ret = re.findall('<(.*?)>.*?<.*?>','<a>wahaha</a>')
print(ret)    # ['a']
ret = re.search('<(.*?)>(.*?)<.*?>','<a>wahaha</a>')
print(ret.group(2)) # wahaha
print(ret.group(1)) # a

9、'2*3/4*5' 乘除法
import re
def mul_div(son_exp):
    if '*' in son_exp:
        a, b = son_exp.split('*')
        mul = str(float(a) * float(b))  # 6
        return mul
    elif '/' in son_exp:
        a, b = son_exp.split('/')
        div = str(float(a) / float(b))  # 6
        return div  # '6/4*5
while True:
    ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
    if ret:
        son_exp = ret.group()   # '2*3'
        res = mul_div(son_exp)
        exp = exp.replace(son_exp,res)
    else:break
print(exp)

 简单的计算器

import re
def cal_atom(exp):
    if '*' in exp:
        a,b = exp.split('*')
        return str(float(a)*float(b))
    if '/' in exp:
        a,b = exp.split('/')
        return str(float(a)/float(b))
def exp_format(exp):
    exp = exp.replace('--','+')
    exp = exp.replace('+-','-')
    exp = exp.replace('++','+')
    exp = exp.replace('-+','-')
    return exp
def inner_bracket(s):
    while True:
        parttern = r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?' # 取乘法
        ret = re.search(parttern,s)
        if ret:
            exp = ret.group()
            res = cal_atom(exp)
            s = s.replace(exp,res)
        else:break
    s = exp_format(s)
    ret = re.findall('[-+]?\d+(?:\.\d+)?',s)  # ?:取消小括号的优先级。取加法
    count = 0
    for i in ret:
        count +=float(i)
    return count
def remove_bracket(s):
    while True:
        ret = re.search('\([^()]+\)',s)   # 取内层括号里面的式子
        if ret:
            no_bracket = ret.group()
            res = inner_bracket(no_bracket)
            s = s.replace(no_bracket,str(res))
            s = exp_format(s)
        else:
            return s
def main(s):
    s = s.replace(' ','')
    s = remove_bracket(s)
    return inner_bracket(s)
s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
ret = main(s)
print(ret)