【问题标题】:Having trouble with special characters in a string, super hard coding challenge problem [closed]字符串中的特殊字符遇到问题,超级硬编码挑战问题[关闭]
【发布时间】: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 对于我假设的每种可能性都需要大量代码。

标签: python string char


【解决方案1】:

我不完全确定这是否是正确答案,因为问题有点不清楚。但是检查一下:

import re
def checkvalid(string1):
    if re.search(r'[\d.]\s+[\d.]', string1): return False # two numbers separated by spaces
    string1 = string1.replace(' ', '')
    return (bool(re.search(r'\d', string1))               # must contain numbers
        and not re.search(r'\.\d*\.', string1)            # a number can't contain two dots
        and not re.search(r'[$^]{2}|#[$^]|[$^]#[$^#]', string1) # obviously
        and not re.search(r'^[$^]|[$^]$', string1)        # special at the beginning or end
        and not re.search(r'^##|##$', string1)            # two hashes at the beginning or end
    )

【讨论】:

  • 呃,等等。您说 有 3 个特殊字符:$ # ^ - & 不是其中之一。你还说你可以假设你会得到一个只有数字和/或这些特殊字符的字符串。所以我完全假设。那么我们实际上是在谈论 4 个特殊字符 # $ & ^ 吗?
  • None 在技术上是 False,但如果您明确需要,请参阅编辑。
  • 等等,实际上它仍然没有通过一项测试:“5###5”,只要有两个以上的“#”,你的代码在应该返回 false 时仍然返回 true。我通过在第二个 re.search 行中添加 |[#]{3} 来修复它
【解决方案2】:

这个正则表达式匹配所有列出的失败案例:

([$^]{2,}|\d +\d|(?<!\w )[$^]\d)With Examples

仍然缺少许多边缘情况,整个问题甚至可能无法用正则表达式解决,但这是一个不错的开始。 您可能会遇到负面的后视问题,因为它们的宽度不能不固定。

(
    [$^]{2,}        // two special characters
    |               // or
    \d +\d          // two numbers separated by space(s)
    |
    (?<!\d )[$^]\d  // a special char then a number not preceded by a special character
)

【讨论】:

  • 我不这么认为 - ^##### 怎么样?您的正则表达式与这些不匹配。
  • 正如我所说,仍然缺少许多边缘情况,我现在正在工作,我会尝试在家修复它们:)
  • 感谢您的尝试,即使工作也无法阻止您。意义重大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2017-06-03
  • 2018-07-28
相关资源
最近更新 更多