2013-07-21 51 views
1

我试图找出一个特定的句子模式是否有像R.E.M这样的缩写词。或CEO。我正在寻找的缩写词是大写字母加上R.E.M.或全部大写。正则表达式来匹配某些句子模式与Python

#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." 

编辑:我期待看看上面的句子模式是否有缩写词。

+2

您必须首先在您的脑海中定义什么被视为“缩写词”,例如:“什么是SEA?” –

+0

@CasimiretHippolyte - 在这种情况下,缩写词是带有全部大写或首字母缩写的单词,如Y.M.C.A.代表青年男子基督教协会。 – Cryssie

+0

对不起,我不太了解村里的人。 –

回答

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!"  

但它很可能取决于你是否期待诡计双引号括起来,例如进行调整了。

+0

我更新了包含使用'((?:[A-Z] \。)+ | [A-Z] +))'以匹配缩写的Casimir的建议。只有'([A-Z \。] +)'有可能匹配......或F..K。 – Alnilam

+0

@Cimimir - 抱歉,我还没有足够的积分来回复任何地方,但是你的正则表达式在\ 1之前有一个无与伦比的paren。不错的解释。 – Alnilam

+0

谢谢!我没有看到它。 –

0

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

您可能还想检查报价处理。也许这只是在这里发布你的代码的人造物,但似乎与你的和你的代码有一些混淆。尝试

['`"]* 

改为两者。

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的这些通知)。

0

这应该工作:

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

你可以做一些/如有必要,所有组的非捕获,也可以使终端问号可选的(我注意到它从你的例子一人失踪) 。可以在这里和那里进行一些调整,但这非常重要。