正则表达一句话

时间:2015-09-30 05:07:35

标签: python regex string

我尝试编写正则表达式来表示具有以下条件的句子:以大写字母开头,以句点结尾(只能出现一个句点),并且允许包含逗号或分号,但是当它出现时,它必须显示为(字母)(分号)(空格)或(字母)(逗号)(空格)。

我得到了大写字母和期限。我有代码的想法但我认为我没有完全正确的语法...

在英语中,我对句子的表达式如下:

(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?"

3 个答案:

答案 0 :(得分:0)

^(?!.*[;,]\S)(?!.* [;,])[A-Z][a-z\s,;]+\.$

更容易使用lookaheads删除无效句子。请参阅演示。

https://regex101.com/r/vV1wW6/36#python

答案 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)*]*\.$"

它最终工作得很好。感谢大家的帮助!