【发布时间】:2020-06-22 10:53:00
【问题描述】:
我必须使用以下规则检查字符串的有效性:
有3个特殊字符:$#^
-
它们不能在字符串中彼此相邻(忽略空格),但数字/磅/哈希字符 (#) 除外。
- # 字符可以出现在另一个特殊字符之后,但只能出现在一个特殊字符之后。
-
特殊字符前后必须有数字,如果后面有数字,则#字符除外。但是,如果有两个,则两个 # 之前必须有一个数字。
- “#5”有效
- “##5”无效
- “5##5”有效
如果字符串中只有特殊字符,则自动失效。
- 如果字符串中只有一个数字是有效的。如果有多个以空格分隔的数字,则该字符串不再有效。
- 例如“25 40”无效,因为 25 和 40 用空格隔开
- “25”有效
你可以假设你会得到一个只有数字和/或这些特殊字符的字符串。
您可以假设您不会在字符串中得到任何零,例如 0#0 或悬挂零,例如:0.000、00004 或 4.000
对所有数字一视同仁,因此 .4 是一个数字,它的作用与 0.4 或 5 或 3.2 或 9231 等相同。
您可以假设数字不是科学记数法或任何其他特殊数字,此处仅显示数字。没有负数。
有效字符串示例:
- “#5 #5 #5”
- “5 ^5.321 $#2.6”
- “5^#4.5”
- “#5#5#5”
- “56.2”
无效字符串示例:
- "5 6" (原因:用空格隔开)
- "5^^5" (原因:两个特殊字符相邻)
- "5^^^##5" (原因:相邻的特殊字符太多)
- “^5” (原因:“^”前没有数字)
- “^5&” (原因:“^”前没有数字,“&”后没有数字)
这是我的尝试:
def checkvalid(string1):
string1 = string1.replace(" ", "")
checkStatements = ["$$", "#$", "###", "^^", "#^"]
checkOut = [x for x in checkStatements if x not in string1]
if len(checkOut) != len(checkStatements):
return False
return True
它适用于其中的一些,这很明显,因为它只检查特定模式,但也适用于其他模式,例如:
print(checkvalid("5##5 5"))
print(checkvalid("5$$$"))
打印(checkvalid("$$$"))
打印(checkvalid("$5"))
我的代码对所有这些都返回“True”,尽管这些都是无效的,所以我的代码应该返回 False。我无法考虑运算符不能彼此相邻并检查特殊字符之前或之后的数字这一事实。
【问题讨论】:
-
你的代码不能工作,因为它只检查那些特定的模式,并没有考虑到它可能是####或########### ####等...
-
@GaryWayne 是的,我在我的问题中说过
-
您可以将字符串拆分为特殊字符,然后检查结果列表中的每个元素是否前一个和下一个元素有效
-
负数 (
-1) 或科学计数法 (1e-3) 怎么样? -
@ThomaS 对于我假设的每种可能性都需要大量代码。