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