我有一个充满文字的.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
答案 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