5 回答
TA贡献1880条经验 获得超4个赞
您当前的正则表达式不起作用,因为它试图寻找
^[A-Z]+[a-z]+[\s]+[a-z]+[\.!\?]$
: https://regex101.com/r/b96zXT/2
^[A-Z]+
:字符串开头的一个或多个大写字母[a-z]+
:大写字母后的一个或多个小写字母[\s]+
:小写字母后有一个或多个空格[a-z]+
: 空格后的一个或多个小写字母[\.!\?]+$
:第二串小写字母后的一个或多个标点符号(.
、!
或),然后字符串结束。?
你真正想做的事情:
^[A-Z][A-Za-z\s]+[\.!\?]$
https://regex101.com/r/r3CAdh/2
^[A-Z]
:字符串开头恰好有一个大写字母[A-Za-z\s]+
:一个或多个大写字母/小写字母/空格[\.!\?]$
: 字符串末尾有一个标点符号
TA贡献1875条经验 获得超3个赞
我建议以下正则表达式禁止连续空格和标点符号之前的空格
/^[A-Z][a-z]*(\s[a-z]+)*[\.!\?]$/
解释
^
必须从输入字符串的开头开始[A-Z][a-z]*
第一个单词必须以大写字母开头,后跟任意数量的小写字母(\s[a-z]+)*
在第一个单词之后,可以有任意数量的附加单词(也可以是零)。每个单词前面必须有一个空格(您也可以只使用一个空格,而不是\s
只允许空格但不允许制表符)并且至少包含一个小写字母[\.!\?]$
标点符号必须位于输入字符串的末尾。
例如,这将允许
This is a valid sentence.
但禁止类似的事情
This is not valid ! This is not valid either!
TA贡献1816条经验 获得超6个赞
这应该有效
import re
def check_sentence(text):
result = re.search(r"^[A-Z][A-Za-z\s]*[\.\?!]$", text)
return result != None
print(check_sentence("Is this is a sentence?")) # True
print(check_sentence("is this is a sentence?")) # False
print(check_sentence("Hello")) # False
print(check_sentence("1-2-3-GO!")) # False
print(check_sentence("A star is born.")) # True
TA贡献1783条经验 获得超4个赞
从问题是问
它以大写字母开头,所以我们使用
^[A-Z]
.后面至少跟着一些小写字母或空格,以便我们可以使用
[a-z\s]+
。并以句号、问号或感叹号结尾。所以我们可以使用
[\.\?!]$
.\
之前的and.
称为?
“转义字符”,它用于转义.
and?
因为它们都是正则表达式操作的一部分。
好了,你的问题的答案是result = re.search(r"^[A-Z][a-z\s]+[\.\?!]$", text)
。
添加回答
举报