在python中,如何在选定的子字符串之前只搜索一个单词

2024-09-29 23:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个文本文件中的一长行列表,我只想返回紧靠在前面的子字符串,例如单词dog(描述dog的单词)。例如,假设这些行包含dog:

“hotdog” “big dog” “is dogged” “dog spy” “with my dog” “brown dogs”

在这种情况下,期望的结果只有“大”“我的”“棕色”

我使用了这个python脚本

^{pr2}$

这将返回“with my”“big”

所以这里我不会得到“brown”,我得到了所有的“with my”

如何在dog之前只指定一个单词(显然,我不能在(.+?)之前加一个空格,因为这样我将排除“big”和{},因为它们在一行的开头)?在

我怎样才能只指定一个字符在dog后面,例如“s”只得到dogs和dog之前的单词而不是dogged?在

在完美的情况下,我也希望能够指定要排除的结果,例如“my”。在

非常感谢


Tags: 字符串列表ismywith情况单词文本文件
3条回答

只需按空格将行拆分为一个数组,然后就可以在数组中找到dog并在其前面打印元素。在

with open('titles_500subset.txt') as searchfile:
    for line in searchfile:
        words = line.lower().split()
        if 'dog' in words[1:]:
            print words[words.index('dog')-1]

如果你想让它每行检测到多个狗,那就需要多一点,但是如果空格对你来说很重要的话,它就可以更简单地获取某些单词。在

同样,我这样做的方式会使整个文档变为小写,因此如果您不希望它那样工作,您需要为此添加额外的检查。在

我改变了if条件来检查它是否发现“Dog”的索引大于零,因此它可以有效地检查Dog是否存在,并确保它不在句子的开头。(如果它在0处找到dog,则在-1处查找前面的单词,这意味着它从该行中取最后一个单词,这是不希望的行为)

如果要检查多个关键字:

^{pr2}$

只需在关键字列表中添加任何你想搜索的单词。在

您可以使用positive look ahead

\w+(?=\s(dog|dogs)\b)

Demo

此正则表达式将匹配长度为1或更大且后跟单个whitspace和dog或{}的任何单词。在

注意您只能使用没有单词边界的\w+(?=\sdog),因此它也将匹配is中的is!在

在你的代码中:

^{pr2}$

您可以对整个文本运行正则表达式,而不是在每行上运行它。试试这个:

import re
with open('titles_500subset.txt') as searchfile:
    text = searchfile.read()
    d = re.findall('([^ \r\n]+) dogs?([\r\n]| |$)', text, re.IGNORECASE)
    for result in d:
            print result[0]

正则表达式解释:

  • ([^ \r\n]+)查找不是空格或换行符的内容(一个或多个字符)
  • 后跟空格字符
  • dog后跟“dog”
  • s?后跟可选的“s”
  • ^{cd3>或者从新的一行中选择一个空格

相关问题 更多 >

    热门问题