我试图找出一个特定的句型是否有像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."
编辑:我正在查看上面的句子模式是否有缩写词。
答案 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\.]*)(['"`]*)\?$")
如果有必要,您可以使部分/全部组无法捕获,或者您可以使终止问号可选(我注意到您的某个示例中缺少它)。可以在这里和那里进行一些调整,但这几乎可以做到。