python 匹配字符串“Hello,name”的正则表达式

zujrkrfu  于 2023-01-01  发布在  Python
关注(0)|答案(4)|浏览(208)

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

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

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

h43kikqp

h43kikqp1#

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

  • Hello与初始的"Hello"匹配。
  • 由于逗号是可选的,因此不匹配
  • \s{1}匹配"Hello"后面的空格(请注意,{1}是冗余的。\s本身将执行相同的操作,匹配单个空格)
  • \S与逗号匹配
  • .*匹配字符串的其余部分,即" name"

要防止出现这种情况,请考虑在名称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("\n")

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'>
fcipmucu

fcipmucu2#

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

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

Regex demo

acruukt9

acruukt93#

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

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

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

e7arh2l6

e7arh2l64#

此正则表达式将匹配字符串“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.")

相关问题