【问题标题】:Regex to match the string "Hello, name"匹配字符串 \"Hello, name\" 的正则表达式
【发布时间】:2023-02-12 10:27:19
【问题描述】:

我需要一个可以匹配“你好,名字”模式的正则表达式,但逗号是可选的。如果逗号不存在,则 Hello 和 name 之间的空格数应为一个。如果存在逗号,则逗号和名称之间的空格数应为一个。 Hello +(逗号+空格或空格)之后,至少要有一个字符,后面可以跟任何东西

我尝试了以下正则表达式

Hello,?\s{1}\S.*

但它也匹配"Hello , name",即你好和逗号之间的空格。

【问题讨论】:

  • 而且,这个正则表达式有什么问题? (参见:regex101.com/r/EJgZTm/1),它似乎工作正常......
  • 这个正则表达式也将接受这个 -> “你好,名字”,即你好和逗号之间的空格
  • 是什么阻止您使用您在问题中表达的交替:Hello(?:, | )\w+

标签: python python-3.x regex


【解决方案1】:

Hello,?s{1}S.* 匹配"Hello , name"(Hello 后的空格)的原因是:

  • Hello 匹配初始的 "Hello"
  • 由于逗号是可选的,所以不匹配
  • s{1} 匹配"Hello" 之后的空格(注意{1} 是多余的。s 本身会做同样的事情,匹配单个空格)
  • S 匹配逗号
  • .* 匹配字符串的其余部分,即 " name"

为防止这种情况,请考虑使用以下正则表达式在名称中禁用逗号和空格:^Hello,?s[^,s]+$Try online

^Hello,?s[^,s]+$
------------------
^                $      : Start and end of string
 Hello                  : Literal Hello
      ,?                : Optional comma
        s              : One whitespace
          [^,s]+       : One or more characters that are not comma or space
import re

strings = """Hello, Chopin
Hello Brahms
Hello,  Mozart
Hello , name
Hello  name
Hello Chopin""".split("
")

for test in strings:
    print(test, re.search(r"^Hello,?s[^,s]+$", test))

给出:

Hello, Chopin <re.Match object; span=(0, 13), match='Hello, Chopin'>
Hello Brahms <re.Match object; span=(0, 12), match='Hello Brahms'>
Hello,  Mozart None
Hello , name None
Hello  name None
Hello Chopin <re.Match object; span=(0, 12), match='Hello Chopin'>

【讨论】:

  • 问题是,名字的第一个字母可以是任何东西......也可以以逗号开头
  • 当然!在这里,我们陷入了旧的Falsehoods Programmers Believe About Names。在那种情况下,", name" 不是有效名称吗?消息"Hello , name" 将是一条有效消息
  • 警告那些快速的读者.... Try online 版本使用的正则表达式与本答案开头的正则表达式不同。 (就这么多?,所以我浪费了15分钟?)
  • 答案开头的正则表达式也不是该答案推荐的正则表达式。我说得更清楚了,这样在未来的新年前夜读这篇醉酒的人就不会感到困惑@Luuk :D
  • @Chopin 继续我昨天的评论,决定是否允许将某物作为名称的标准是什么?如果它可以包含逗号和空格,则 "Hello , name" 是有效输入 (name=", name")。如果允许逗号但不允许空格,您可以更改正则表达式以从 [^,s]+ 中删除逗号
【解决方案2】:

您可以使用 negative lookahead 来防止 ,S 匹配。

Hello,?s(?!,)S.*

See the demo at regex101 - 允许Hello ,name使用Hello,?s(?!,s)S.*

【讨论】:

    【解决方案3】:

    您可以使用正则表达式,Hello,?sS.*,其解释如下:

    • Hello:一句话,你好
    • ,?:可选逗号
    • s:单个空白字符
    • S:单个非空格字符
    • .*:任何字符任意次数

    Regex demo

    【讨论】:

    • 这遇到了 OP 最初报告的相同问题:匹配"Hello , name"
    【解决方案4】:

    这个正则表达式将匹配字符串“Hello, name”,即使它之前或之后还有其他字符。

    import re
    
    pattern = r".*Hello, name.*"
    
    # Test the regular expression
    if re.match(pattern, "Hello, name"):
        print("Match found!")
    else:
        print("Match not found.")
    

    【讨论】:

    • 虽然您的解释符合您的模式,但不幸的是,这不是问题的答案。 (顺便说一句,不是我的反对票)
    猜你喜欢
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多