如何检查字符串中的某些内容?

时间:2020-03-09 19:18:46

标签: python string list

如果字符串为:

,我的代码应该返回None

包含不受支持的运算符或非数字。支持的运算符为:**,*,^,-,+,/,(,)

示例

“ 4.0 + 2” 有效

“ 3.88327-$ 3.4”是无效(由于“ $”)

“ a + 24”是无效(因为“ a”)

“ 2 + 6”是有效

“ 4 + / 3”是无效(因为“ + /”是两个相邻的运算符)

“ 4 **-3” 有效

我该怎么做?

这是我的代码:

def checkvalid(string1):
    temp = string1.split()
    for i in len(temp):
        if i in "*^-+/()":
            return None
        if not i.isnumeric():
            return None

    return string1

但这并不总是有效。它仅适用于“ 22 66”之类的常规整数->此方法有效,它返回字符串,但似乎没有其他效果,它始终返回None。

3 个答案:

答案 0 :(得分:1)

更新的答案

自从我最初回答以来,您已经为这个问题添加了七个新要求。我与您脱离接触,因为我认为您需要在寻求更多帮助之前更好地了解所面临问题的范围。

但是,我将抛出另一个片段,这可能会使您走上正确的道路,因为您似乎正在寻找有效的数学表达式。下面的代码可以做到这一点:

def check_valid(data):
    errors = (SyntaxError, NameError)
    try:
        eval(data)
    except errors:
        for i in data.split():
            try:
                eval(i)
            except errors:
                return None
    return data

test = ["4++2", "4+-2", "4.0 + 2", "3.88327 - $3.4", "a + 24", "2+6", "4+/3"]

for t in test:
    try:
        assert check_valid(t)
        print(f"{t} valid")
    except AssertionError:
        print(f"{t} not valid")

输出

4++2 valid
4+-2 valid
4.0 + 2 valid
3.88327 - $3.4 not valid
a + 24 not valid
2+6 valid
4+/3 not valid

在Python中,+可以重复任意次数,但仍然是有效的数学表达式,因为它只是反复更改整数的符号。


原始答案

有多种方法可以解决此问题。以您的示例为例,您的逻辑存在一些缺陷:

  • “ 4.0”不是数字。数字为0-9或Unicode数字。 Docs here
  • 您正在使用in关键字将一个字符串与另一个字符串进行比较。在第一个示例字符串中,序列“ 4.0”显然不在序列“ * ^-+ /()”中。运作方式示例:
>>> "4.0" in "asdf4.012345"
True
>>> "4.0" in "0.4"
False

使用类似逻辑的快速解决方案是按字符而不是逐字检查,并将两个条件与and组合在一起。尝试以下代码段:

def check_valid(data):
    for word in data.split():
        for character in word:
            if character not in "*^-+/()." and not character.isnumeric():
                return None

    return data

test = ["4.0 + 2", "3.88327 - $3.4", "a + 24", "22 66", "2+6"]

for t in test:
    print(f"Test: {check_valid(t)}")

输出

Test: 4.0 + 2
Test: None
Test: None
Test: 22 66
Test: 2+6

注意::我更改了一些名称,以更严格地遵循python代码样式的最佳做法。

答案 1 :(得分:0)

在评估中添加一些检查可以使其更加安全,尽管并不理想。

onclick()

答案 2 :(得分:-1)

另一种选择是使用正则表达式检查表达式是否包含无效字符;或使用字符串解析器。 因为您的表达式很简单,所以让python做我们的工作

def check_valid(expression: str):
try:
    eval(expression) # Execute the expression; If the expression is valid, return the result of the evaluation; if is invalid; raise exception
    return True
except Exception as _:
    return False

if __name__ == '__main__':
    print("{expression}: {validity}".format(expression="4.0 + 2", validity=check_valid("4.0 + 2")))
    print("{expression}: {validity}".format(expression="3.88327 - $3.4", validity=check_valid("3.88327 - $3.4")))
    print("{expression}: {validity}".format(expression="a + 24", validity=check_valid("a + 24")))
    print("{expression}: {validity}".format(expression="2+6", validity=check_valid("2+6")))