我尝试编写正则表达式来表示具有以下条件的句子:以大写字母开头,以句点结尾(只能出现一个句点),并且允许包含逗号或分号,但是当它出现时,它必须显示为(字母)(分号)(空格)或(字母)(逗号)(空格)。
我得到了大写字母和期限。我有代码的想法但我认为我没有完全正确的语法...
在英语中,我对句子的表达式如下:
(capital letter) ((lowercase letter)(space) ((lowercase letter)(comma)(space))*
((lowercase letter)(semicolon)(space)* )* (period)
我意识到这忽略了句子的第一个字母后面紧跟逗号或分号的情况,但忽略这种情况是安全的。
现在当我尝试用Python编写代码时,我尝试以下内容(我已经添加了空格以便于阅读):
sentence = re.compile("^[A-Z] [a-z\\s (^[a-z];\\s$)* (^[a-z],\\s$)*]* \.$")
我觉得这是一个语法问题......我不确定我是否允许在括号内加上分号和逗号部分。
与定义匹配的示例输入:
"This is a sentence."
"Hello, world."
"Hi there; hi there."
与定义不符的示例输入:
"i ate breakfast."
"This is , a sentence."
"What time is it?"
答案 0 :(得分:0)
^(?!.*[;,]\S)(?!.* [;,])[A-Z][a-z\s,;]+\.$
更容易使用lookaheads
删除无效句子。请参阅演示。
答案 1 :(得分:0)
这与你上面所说的相符。
^"[A-Z][a-z]*(\s*|[a-z]*|(?<!\s)[;,](?=\s))*[.]"$
? =&GT; demo
这将匹配:
"This is a sentence."
"Hello, world."
"Hi there; hi there."
这不匹配:
"i ate breakfast."
"This is , a sentence."
"What time is it?"
"I a ,d am."
"I a,d am."
如果您不需要"
,请将其从正则表达式中删除。
如果你需要python中的正则表达式,试试这个
re.compile(r'^[A-Z][a-z]*(\s*|[a-z]*|(?<!\s)[;,](?=\s))*[.]$')
Python演示
import re
tests = ["This is a sentence."
,"Hello, world."
,"Hi there; hi there."
,"i ate breakfast."
,"This is , a sentence."
,"What time is it?"]
rex = re.compile(r'^[A-Z][a-z]*(\s*|[a-z]*|(?<![\s])[;,])*[.]$')
for test in tests:
print rex.match(test)
<强>输出强>
<_sre.SRE_Match object at 0x7f31225afb70>
<_sre.SRE_Match object at 0x7f31225afb70>
<_sre.SRE_Match object at 0x7f31225afb70>
None
None
None
答案 2 :(得分:-1)
我最后修改了我的正则表达式
"^[A-Z][a-z\s (a-z,\s)* (a-z;\s)*]*\.$"
它最终工作得很好。感谢大家的帮助!