【问题标题】:Output the line number for all string matches within a file [duplicate]输出文件中所有字符串匹配的行号[重复]
【发布时间】:2014-07-21 23:59:03
【问题描述】:
def line_number(word, fname):
    with open(fname) as f:
        number_list = ""
        for i, line in enumerate(f, 1):
            if word in line:
                number_list += (str(i)+", ")      
        return number_list[:-2]

上面的函数假设在一个txt文件中找到匹配字符串出现的行号。但是,例如,如果我们正在搜索字符串“yes”,并且我们在第 20 行有字符串“yes”,在第 51 行有字符串“eyes”,则该函数将返回第 20 行和第 51 行,因为第 51 行包含一个子字符串“眼睛”中的“是”,我该如何解决这个错误?

好的,我已经解决了问题,把if word in line:改成if word in re.split('(\W+)', line):

通过这样做,我将行拆分为单词和标点符号以找到完全匹配的内容。

但我注意到另一个问题。比如line 159上有一句“你你你”。 you这个词出现3次,函数只统计youline 159出现一次,程序打印出来:

you 159

但我希望函数计算 3 次并打印出来:

you 159, 159, 159

有什么办法吗?

【问题讨论】:

  • 谢谢,我已经解决了这个问题,但是我发现还有一个问题,你能看看吗?

标签: debugging


【解决方案1】:

要在一行中包含重复的匹配项,您可以使用re.findall

re.findall(pattern, string, flags=0)

返回stringpattern的所有非重叠匹配,作为字符串列表

只需替换这个:

if word in line:

用这个:

for match in re.findall(r'\b' + word + r'\b', line):

【讨论】:

  • 非常感谢!!!!这个完全有效,它解决了查找额外子字符串的问题,并且计算了整行!
【解决方案2】:

if word in line 替换if word == line.strip()

【讨论】:

  • 不行,一个词不能和一行完全匹配,对吗?
  • 你是对的,每一行末尾都有一个换行符(\n)。我编辑我的答案。
  • 也不行,打印无法显示行号。受您的 strip() 方法的启发,我尝试改用 slpit() 方法,将行分成单词,然后找到匹配项。但是它出现了一个错误,说“'str'对象没有属性'slipt'”,我确定“line”是一个字符串类型并且可以拆分,你能告诉这里发生了什么吗?
  • 好吧,首先你拼错了 split :P
  • 你为什么要这样做? return number_list[:-2]
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2011-08-29
  • 2015-06-22
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多