正则牛刀小试

做题遇到一个有意思的题目,和大家分享一下。

函数 from_string(string):

输入是 string 左边的字符串,输出是右边的数或者 False。
字符串必须是 "./frac{.}{.}.“形式,否则输出 False。其中”."  表示任意字符。

“/frac{1}{2}”              1/2
"  /frac{1}{2}"             1/2
“-/frac{1}{2}”            -1/2
“- /frac{  1}{2}”         -1/2
“/frac{1}{0}”             False
“-/frac{0}{2}”               0
“/frac{01}{2}”           False
“/frac{1}{02}”           False
“+/frac{10}{2}”             5
“/frac{10   }{    2}”         5

函数如下:

import re

def from_string(string):

    if type(string) is not str:
        return False
    # 存放符号,表示符号可以是"+""-"或者是没有
    sigin = "[+|-]{0,1}"
    num = "(?:\s*"+sigin+"[1-9]\d*\s*)|?:\s*0\s*)"          # (?......)表示分组不保存
    p = re.compile("("+sigin+r")\s*\\frac{("+num+")}{("+num+")}")             # 有三个待保存分组
    m = p.match(string.strip())          # 去除表达式两边的空字符
    if m:
        numerater = int(m.group(2))
        denominator = int(m.group(3))
        if sigin == "-":
            return -numerater/denominator
        else:
            return numerater/denominator
    else:
        return False