Python:字符/字符串的搜索行的等价物

时间:2014-11-11 22:31:50

标签: python search

我有一个充满文字的.txt文档。我想搜索特定字符(或理想的字符组(字符串)),然后使用找到的字符进行搜索,并在所选字符后面的字符2/4后面进行搜索。

我创建了一个搜索字符行的版本,但我找不到字符的等价物。

f = open("C:\Users\Calum\Desktop\Robopipe\Programming\data2.txt", "r")
searchlines = f.readlines()
f.close()
for i, line in enumerate(searchlines):
  if "_" in line: 
    for l in searchlines[i:i+2]: print l, #if i+2 then prints line and the next
    print

2 个答案:

答案 0 :(得分:0)

如果我理解了这个问题,你想要的是重复搜索一个巨大的字符串,而不是逐个搜索字符串列表。

所以,第一步是,不要使用readlines,使用read,这样你就可以获得一个巨大的字符串。

接下来,如何重复搜索字符串中的所有匹配项?

嗯,字符串是可迭代的,就像列表一样 - 它是一个可迭代的字符(它们本身就是长度为1的字符串)。所以,你可以迭代字符串:

f = open(path)
searchstring = f.read()
f.close()
for i, ch in enumerate(searchstring):
    if ch == "_":
        print searchstring[i-4:i+2]

但是,请注意,只有在您只搜索单字符匹配时,此功能才有效。如果您在前四个字符中找到_,则会失败。并且逐个循环遍历几MB的文本可能是低效的。*因此,您可能希望循环遍历str.find

i = 4
while True:
    i = searchstring.find("_", i)
    if i == -1:
        break
    print searchstring[i-4:i+2]

*您可能想知道find除了相同类型的循环之外可能会做什么。而且你是对的,它仍在逐个字符地迭代。但它是在标准库提供的优化代码中进行的 - 使用通常的CPython实现,这意味着"内部循环"是C代码而不是Python代码,它不需要" box up"每个角色都要测试它等等,所以它可以更快,更快。

答案 1 :(得分:0)

您可以使用正则表达式:

正则表达式搜索任何两个字符(不是_),_,然后搜索任何不是下划线的四个字符。

import re
with open(path) as f:
    searchstring = f.read()
regex = re.compile("([^_]{2}_[^_]{4})")
for match in regex.findall(searchstring):
    print match

输入:

hello_there my_wonderful_friend

脚本返回:

lo_ther
my_wond
ul_frie