1

我试图找出一个特定的句型是否有一个缩写词,如 REM 或 CEO。我正在寻找的缩写词是带有大写字母的单词,并带有 REM 或全部大写的句点。

#sentence pattern = 'What is/was a/an(optional) word(abbreviated or not) ?
sentence1 = 'What is a CEO'
sentence2 = 'What is a geisha?'
sentence3 = 'What is ``R.E.M.``?'

这就是我所拥有的,但它根本没有返回任何东西。它无法识别模式。我无法弄清楚正则表达式有什么问题。

c5 = re.compile("^[w|W]hat (is|are|was|were|\'s)( a| an| the)*( \`\`)*( [A-Z\.]+\s)*( \'\')* \?$")
if c5.match(question):
    return "True."

编辑:我想看看上面的句型是否有缩写词。

4

4 回答 4

1

你有几个问题。从您的示例中并不清楚可能需要什么样的引用,或者您是否想匹配那些不以问号结尾的引用。当我认为您可以使用(零个或以前的一个)时,您的正则表达式使用*(零个或以前的任意数量?)。What's即使我认为你想要那些,你也会错过句子,因为你正在寻找What 's

这是一个可能的解决方案:

 import re
 sentence1 = "What is a CEO"
 sentence2 = "What is a geisha?"
 sentence3 = "What is ``R.E.M.``?"
 sentence4 = "What's SCUBA?"

 c1 = re.compile(r"^[wW]hat(?: is| are| was| were|\'s)(?: a| an| the)? [`']{0,2}((?:[A-Z]\.)+|[A-Z]+)[`']{0,2} ?\??")

 def test(question, regex):
     if regex.match(question):
         return "Matched!"
     else:
         return "Nope!"

 test(sentence1,c1)
 > "Matched!"
 test(sentence2,c1)
 > "Nope!"
 test(sentence3,c1)
 > "Matched!"
 test(sentence4,c1)
 > "Matched!"     

但它可能会进行更多调整,具体取决于您是否期望缩写被双引号,例如。

于 2013-07-21T01:56:04.113 回答
0

这应该有效:

re.compile("^[wW]hat (is|are|was|were) ((a|an|the) )*(['"`]*)([A-Z\.]*)(['"`]*)\?$")

如有必要,您可以使部分/所有组不捕获,或者您可以将终止问号设为可选(我注意到您的一个示例中缺少它)。可以在这里和那里进行一些调整,但这几乎可以做到。

于 2013-07-21T01:35:04.873 回答
0

缩写检查前后空格的位置是关闭的。

您可能还想检查您的报价处理。也许这只是在这里发布您的代码的人工制品,但您的 ' 和 `' 似乎有些混淆。尝试

['`"]*

而不是两者。

于 2013-07-21T01:19:13.097 回答
0

你可以试试这个模式:

c5 = re.compile(r"^[wW]hat (?:is|are|w(?:as|ere)|'s)(?: (?:an?|the))? ([`'\"]*)((?:[A-Z]\.)+|[A-Z]+)\1 ?\??$")

解释:

假设您不需要提取内部的内容(缩写除外),我使用非捕获组(?:..)而不是捕获组。(..)

[w|W]被替换为[wW]因为|在字符类中被视为文字。

为了使缩写周围的不同引号可选,我在之前使用了一个捕获组(可以是无效的):([`'\"]*)并且我在缩写之后使用了一个反向引用(即\1:)

(?:[A-Z]\.)+该缩写被描述为(带点的大写字母)或仅大写之间的交替[A-Z]

通过使空格可选,我在缩写和问号之间不允许空格(现在也是可选的,感谢 FooBar 的这些通知)。

于 2013-07-21T01:26:35.617 回答