Python:检查字符串是否为使用正则表达式或try-except的数字

时间:2014-05-19 21:05:34

标签: python regex python-3.x

首先在这里发帖,尝试搜索,但每个人的答案都是'使用正则表达式'。希望我能够很好地符合网站的其他标准。

学习python和hw赋值是创建一个函数来测试字符串是否为数字。使用例外很容易。我们被要求提出另一种测试方法,提示是使用正则表达式。再一次,很容易。

我自己试图更好地感受python,我想做同样的事情没有正则表达式,并希望任何字符串的附加功能可以评估为一个数字,以返回True,所以例如,'5 ++ -3j + + 4.j-6.1'应返回True,但'j32'将返回False。

我遇到了一些问题:例如,'5j'为False但'+ 5j'和'+ = 5j'都为True。此外,函数中的打印语句只是让我可以看到计算机在各个阶段看到的内容。谢谢!

编辑:我意识到复数j的变量j的不幸放置,但引号应该明确指出哪个j被引用。

编辑:如@georg所述,我希望测试字符串是否为数字表达式,如果它的计算结果为

def is_itnumber(el):
    '''Identifies if a string can be converted to a number, in an unuseful way!'''
    mast=[]
    el_p=el.split(sep='+')
    for el_m in el_p:
        n=el_m.split(sep='-')
        mast.extend(n)
    for l in mast:
        if l=='': mast.remove(l)
        print(mast)
        for j in range(len(l)):
            print( l[j])
            if l[j]==',':
                if j not in range(len(l)-3):
                    return False
                elif (l[j+1].isdigit()==0 or l[j+2].isdigit()==0 or l[j+3].isdigit()==0):
                    return False
            elif l[j]=='j':
                if j != len(l):
                    return False
            elif l[j]=='.':
                for x in range(len(l)):
                    if l[x]=='.' and x!=j:
                        return False
            elif l[j].isdigit()==0:
                    return False
    else:
        return True

2 个答案:

答案 0 :(得分:2)

我不知道5++-3j + + 4.j-6.1是什么。但是如果你想测试字符串s中的整数:

all(['0' <= c <= '9' for c in s])

您可以展开花车:

all(['0' <= c <= '9' for c in s]) and s.count('.') <= 1

除此之外,你基本上是在实现一个可能有错误并且表现不佳的自定义正则表达式引擎。

编辑:我纠正了:

>>> 5++-3j + + 4.j-6.1 
(-1.0999999999999996+1j)

我唯一的另一个想法是使用ast.parse

答案 1 :(得分:2)

我猜你的意思是&#34;一个数字表达式&#34;而不只是一个&#34;数字&#34;在你的问题。 5++-3j + + 4.j-6.1绝对不是一个数字,但它是一个有效的&#34;数字表达式&#34;。由于这是一种语言,因此您需要parser来验证它。幸运的是,python提供了一种解析自己的方法:ast module。在没有声明完整性的情况下,这里是可能实现的草图:

import ast

class CheckNumeric(ast.NodeVisitor):
    def validate(self, expr):
        self.valid = True
        self.visit(ast.parse(expr))
        return self.valid

    def check(self, node):
        operators = [ast.Add, ast.Sub, ast.Mult, ast.Div, ast.UAdd, ast.USub]
        if type(node) in [ast.BinOp, ast.UnaryOp]:
            return type(node.op) in operators
        return type(node) in operators + [ast.Module, ast.Expr, ast.Num]

    def generic_visit(self, node):
        if not self.check(node):
            self.valid = False
        if self.valid:
            ast.NodeVisitor.generic_visit(self, node)

此类应接受数字表达式并拒绝所有其他表达式:

print CheckNumeric().validate('5++-3j + + 4.j-6.1') # True
print CheckNumeric().validate('j32') # False
print CheckNumeric().validate('foo((((') # SyntaxError