我正在尝试编写一个正则表达式,在句子列表中找到单词“squirrel”。该表达式应返回包含单词“squirrel”的完整句子列表。
包含“squirrel”一词的句子可能如下所示:
松鼠有一条长尾巴(。)长尾巴。(。) 猫(a)n(d)松鼠(a)n(d)兔子(a)n(d)bunnys(a)n(d)(。)
松鼠+尾巴
目前re
我看起来像这样
word_only += re.findall('(.*?' + word + '?!\S)', sentence)
word_only += re.findall('.*?' + word + '\S+', sentence)
但它只返回单词前面的任何内容(“松鼠”),而不是它之后。
有什么想法吗?感谢
答案 0 :(得分:4)
根本不需要在这里使用正则表达式。
#The example string:
s = '''the squirrel has a long tail (.) say (.) long tail .
cats (a)n(d) squirrels (a)n(d) rabbits (a)n(d) bunnys (a)n(d) (.)
the squirrel+has a tail'''
sentencelist = s.split(".") #split on periods
[sentence for sentence in sentencelist if sentence.find("squirrel") != -1]
#If you don't find any squirrels, hold fire!
另一方面,如果你有缩写/标题,这个脚本会分成太多的句子。当我不得不解决这样的问题时,我最终使用像\.\s+(?=[A-Z])
这样的正则表达式,然后拆分匹配。这修复了缩写,例如N.A.A.C.P.,但不是标题,例如史密瑟斯先生。我最终建立了一个标题词典,并且直到我完成重新计算和计数之后才对这些期间进行修改。 YMMV。
答案 1 :(得分:0)
如果我理解正确,你有一个字符串列表,每个字符串都包含一个句子。
squirrel_sentences = []
for sentence in sentences:
if re.match(word):
squirrel_sentences.append(sentence)
如果您有一个包含多个句子的单个字符串,您可以尝试使用此正则表达式的匹配项,它会查找包含squirrel
的句点到句点的跨度(也支持包含\A
和\Z
)的第一句和最后一句:
(?:\A|(?<=.))[^.]*squirrel[^.]*(?:.|\Z)