【问题标题】:Test for comma delimited string, ignoring any encountered periods, say from real numbers?测试逗号分隔的字符串,忽略任何遇到的句点,比如实数?
【发布时间】:2021-08-08 02:54:37
【问题描述】:

以下适用于简单的逗号分隔字符串,它没有句点,但如果发现实数中的句点,它会中断。

pattern = re.compile(r"^(\w+)(,\s*\w+)*$")

如何修改或更改以上内容以忽略句点?但仍然验证给定的字符串是否以逗号分隔?

一个示例测试字符串是"23,HIGH,1.0,LOW,1.0,HIGH,1.0,LOW,1.0"

【问题讨论】:

    标签: python python-3.x regex


    【解决方案1】:

    \w 匹配“单词”字符:字母、数字和_。它不匹配一个点。如果您也想匹配点,请使用[\w.] 而不是\w

    pattern = re.compile(r"^([\w.]+)(,\s*[\w.]+)*$")
    

    如果您期望负数,您可能还想添加-。要将 - 放入字符类中,您要么必须使用反斜杠转义它,要么确保它是类中的第一个或最后一个字符:

    [-.\w]
    [\w.-]
    [\w\-.]
    

    【讨论】:

    • 不确定我是否理解...我提供的示例字符串使用给定的表达式失败。它“看到”句点,即小数。如果我将 '\w+' 更改为 '\w' 它仍然失败。我对正则表达式一无所知......也许很少使用它们,几乎从不使用它们。而且,在当前用例中没有负数,它们将始终是真实的正值。所以我认为你的回答不能满足我的需要,给我的误解?如示例所示,我需要将实数作为逗号分隔字符串中的有效值接受,但(新)表达式不会超出句点。
    • @schorschi:好的,我将答案编辑得更明确。我从来没有建议将\w+ 更改为\w。我建议将\w 更改为[\w.]
    • @rici 建议.+ 处理其他字符可能会更好,例如#@ 等。CSV 行似乎包括任意字符串文本和实数。
    • @YuChen:如果它接受了任何东西,那将毫无意义。应该验证该行符合特定的数据模型,而不是任意的 CSV。我本可以推荐使用真正的 CSV 解析器,但我认为这不是 OP 想要的;他们仍然需要根据他们拥有的任何规则来验证每个字段。要获得更准确的答案,他们必须精确地指定这些规则。
    • @rici,正确,我需要验证字符串是否以逗号分隔,而不是跨越句点......实数。非常感谢详细的答案(修订)。真的帮助了我的理解,因为我对正则表达式的经验很少。但是,正如示例字符串所示,字符串不仅仅是数字是预期/允许的。
    【解决方案2】:

    如果该值只能是数字,并且不希望仅匹配点,则可以使用和交替来匹配单词字符或数字。

    ^(?:[+-]?\d*\.?\d+|\w+)(?:,(?:[+-]?\d*\.?\d+|\w+))*$
    

    说明

    • ^ 字符串开始
    • (?:非捕获组
      • [+-]?\d*\.?\d+ 匹配可选的+-,然后是可选的数字、可选的点和1 个以上的数字
      • |或者
      • \w+ 匹配 1+ 个单词字符
    • )关闭非捕获组
    • (?:非捕获组
      • ,匹配逗号
      • (?:[+-]?\d*\.?\d+|\w+)与第一部分相同的模式
    • )* 关闭非捕获组并可选择重复以匹配单个事件
    • $字符串结束

    Regex demo

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多