【问题标题】:In python, how do I search for only one word before my selected substring在python中,如何在我选择的子字符串之前只搜索一个单词
【发布时间】:2015-04-24 09:56:22
【问题描述】:

鉴于文本文件中的行列表很长,我只想返回紧接在其前面的子字符串,例如单词 dog(描述 dog 的单词)。因此,例如说这些行包含 dog:

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

在这种情况下,所需的结果只是“大”“我的”“棕色”

我用过这个python脚本

import re
with open('titles_500subset.txt') as searchfile:
    for line in searchfile:
        line = line.lower()
        d = re.search('(.+?) eye', line)
        if d:
            found = d.group(1)
            print found

这将返回 “with my”“big”

所以在这里我不会得到“brown”,我会得到所有术语“with my”

如何在 dog 之前只指定一个单词(显然我不能在 (.+?) 之前放置一个空格,因为我会排除 “big”“brown” 因为它们位于行首)?

如何只指定一个字符在 dog 之后,例如“s” 只得到狗和狗之前的词而不是顽固的?

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

非常感谢

【问题讨论】:

  • 我没有在你的例子中找到字符串eye
  • 是的,抱歉,错字,我正在搜索许多不同的词。

标签: python regex string


【解决方案1】:

只需将行用空格分割成一个数组,然后你可以在数组中找到 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 处查找前面的单词,这意味着它会从该行中取出最后一个单词,这是不受欢迎的行为)

如果要检查多个关键字:

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

只需将您可能想要搜索的任何单词添加到关键字列表中即可。

【讨论】:

  • 谢谢,这看起来是一个很好的简单答案,但由于某种原因,它只是在 dog (“spy”) 之后返回一个词,这对我来说毫无意义
  • 可以添加 print(line) 看看数组在搜索 dog 和前面的单词时是什么样子的吗?
  • 它打印 'Dog Spy' ,如果有帮助的话,这将是唯一一个以 'dog' 开头的实例
  • 啊哈,因为它是索引0,我会修改我的答案。
  • 返回 ValueError: 'dog' is not in list。如果这有所作为,狗就不会出现在每一行中
【解决方案2】:

这行得通:

re.search('(\S+?) eye', line)

【讨论】:

    【解决方案3】:

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

    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 后跟“狗”
    • s? 后跟可选的“s”
    • ([\r\n]| |$) 从 3 个选项中选择:换行符、空格或文件结尾

    【讨论】:

    • 以这种方式工作,除了你知道为什么这也会从“is dogged”返回“is”的结果吗?
    • 不客气。如果您的问题得到解决,请记住接受其中一个答案。
    【解决方案4】:

    您可以使用positive look ahead

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

    Demo

    此正则表达式将匹配长度为 1 或更长且后跟单个空格和 dogdogs 的任何单词。

    注意你只能使用\w+(?=\sdog)没有字边界,所以它也会匹配is dogged中的is

    在你的代码中:

    import re
    with open('titles_500subset.txt') as searchfile:
        for line in searchfile:
            line = line.lower()
            d = re.search('\w+(?=\s(dog|dogs)\b)', line)
            if d:
                found = d.group(0)
                print found
    

    【讨论】:

    • 这看起来很有意义,但我无法让它工作。我正在输入 d = re.search('\w+(?=\s(dog|dogs)\b)', line)
    • @Betty 如果您使用的是re.search,则需要使用group(0) 方法。做d.group(0)
    • 谢谢,它仍然不适合我,现在很难过!
    • @Betty 你能证明你的文件内容是什么样的吗?
    • 该文件只是一个在每一行上分隔的大列表。即使我使用 searchfile = ('hotdog', 'big dog', 'is dogged', 'dog spy', 'with my dog', 'brown dogs') 运行您的代码,而不是从文本文件中读取,我仍然没有结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2021-10-14
    • 2020-08-25
    • 2022-01-08
    • 2015-06-22
    • 2018-01-08
    • 2013-09-15
    相关资源
    最近更新 更多