正则牛刀小试
做题遇到一个有意思的题目,和大家分享一下。
函数 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