首页 > 解决方案 > 如何检查我的字符串中的某些内容?

问题描述

我的代码应该返回 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”这样的常规整数 -> 这有效,它返回字符串,但似乎没有其他工作,它总是返回无。

标签: pythonstringlist

解决方案


更新的答案

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

但是,我将再抛出一个片段,这可能会让您走上正确的道路,因为您似乎正在尝试找到有效的数学表达式。以下代码将执行此操作:

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 数字。文档在这里
  • 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 代码样式的最佳实践。


推荐阅读