Python:相当于字符/字符串的搜索行

2024-04-25 09:56:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件。我想搜索特定字符(或者理想情况下是字符组(字符串)),然后使用找到的字符和所选字符前面的字符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

Tags: 字符串in版本forifline情况open
2条回答

如果我理解这个问题,你想要的是反复搜索一个巨大的字符串,而不是一个一个地搜索字符串列表。你知道吗

所以,第一步是,不要使用readlines,而是使用^{},这样首先就得到了一个巨大的字符串。你知道吗

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

嗯,字符串是一个iterable,就像列表是一个iterable一样,它是一个由字符组成的iterable(这些字符本身就是长度为1的字符串)。因此,您可以在字符串上迭代:

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

但是,请注意,这只适用于仅搜索单个字符匹配的情况。如果您在前四个字符中找到一个_,它将失败。一个字符一个字符地循环几MB的文本可能效率很低。*因此,您可能希望改为循环^{}

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

*你可能想知道find怎么可能除了做同样的循环之外还做任何事情。你说得对,它仍然是一个字符一个字符地迭代。但它是在标准库提供的优化代码中使用通常的CPython实现来实现的,这意味着“内部循环”是在C代码中而不是在Python代码中实现的,它不必“装箱”每个字符来测试它等等,所以它可以快得多。

您可以使用正则表达式:

正则表达式搜索任意两个字符(不是uux)、一个uux,然后搜索任意四个不是下划线的字符。你知道吗

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

相关问题 更多 >