正则表达式匹配某些句型与Python

时间:2013-07-21 01:10:07

标签: python regex

我试图找出一个特定的句型是否有像R.E.M这样的缩写词。或CEO。我正在寻找的缩写词是带有大写字母的单词,其中包括像R.E.M.这样的句号。或全部大写。

#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 个答案:

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

但是,根据你是否希望缩写是双引号,它可能会被调整得更多。

答案 1 :(得分:0)

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

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

['`"]*

代替两者。

答案 2 :(得分: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提供这些通知),方法是让空格可选。

答案 3 :(得分:0)

这应该有效:

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

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