如何在Python中搜索字符串并去除换行,但返回字符串所在的确切行?
我有一堆PDF文件,需要在里面搜索一些关键词。我需要提取出关键词出现的确切行。我最开始使用了xpdf的pdf2text工具把文件转换成文本格式。(我试过solr,但在调整输出格式和结构方面遇到了困难,没能满足我的需求。)
import sys
file_name = sys.argv[1]
searched_string = sys.argv[2]
result = [(line_number+1, line) for line_number, line in enumerate(open(file_name)) if searched_string.lower() in line.lower()]
#print result
for each in result:
print each[0], each[1]
ThinkCode:~$ python find_string.py sample.txt "字符串提取"
我遇到的问题是,当搜索的字符串在行末被截断时:
如果你要对大型二进制文件进行索引,记得要更改 大小限制。字符串
提取是一个常见的问题
如果我在搜索“字符串提取”,那么使用上面的代码时就会漏掉这个关键词,因为它被分在了两行上。有没有什么更有效的方法来实现这个,而不需要制作两个文本文件(一个用来搜索关键词并提取行号,另一个用来去掉换行符并找到关键词,以避免关键词跨越两行的情况)?
非常感谢大家!
3 个回答
在编写你的表达式时,记得使用标志 re.MULTILINE
。你可以在这里找到更多信息:http://docs.python.org/library/re.html#re.MULTILINE
然后,使用 \s
来表示所有的空白字符,包括换行符。
可能有更好的方法来实现这个,但我建议你可以先输入两行文字(我们叫它们 line1
和 line2
),把它们合并成一行,比如叫 line3
,然后在这行文字中进行搜索。
接着,你可以把 line2
的内容赋值给 line1
,再输入一个新的 line2
,然后重复这个过程。
注意:这里有一些考虑,但我觉得这些更适合放在答案里,而不是评论中。
我的想法是先只搜索第一个关键词;如果找到匹配的,再搜索第二个。这种方法可以让你在找到匹配项位于行尾时,考虑下一行,并且只有在第一行找到匹配时才进行行连接。
编辑:
我写了一个简单的例子,结果用了一种不同的算法;这个代码片段的基本思路是:
def iterwords(fh):
for number, line in enumerate(fh):
for word in re.split(r'\s+', line.strip()):
yield number, word
它会遍历文件中的每一行,并为文件中的每个单词生成一个(行号,单词)的元组。
之后的匹配就变得很简单;你可以在这里找到我的实现:在github上的gist。可以这样运行:
python search.py 'multi word search string' file.txt
关于链接的代码,有一个主要问题,我没有为性能和复杂性考虑编写解决方案。你能找出来吗?(提示:尝试搜索一个在文件中连续出现两次的句子的第一个单词)
* 我自己没有进行任何测试,但这篇文章和python wiki都建议在python中字符串连接效率并不是很好(我不知道这些信息是否仍然准确)。