返回所有';文件中两个字符串之间的字符串[Python 3]

返回所有';文件中两个字符串之间的字符串[Python 3],python,string,list,Python,String,List,我要做的是打开一个文件,然后找到“[\x06I”和“\x06;”的每个实例,然后返回两者之间的任何内容 由于这不是一个标准文本文件(它是RPG maker中的地图数据),readline()将无法满足我的需要,因为该文件的格式根本没有使我想要的数据总是整齐地放在一行之内 我现在正在做的是用read()将文件加载到一个列表中,然后简单地从一开始就删除字符,直到我点击字符串“[\x06I”。然后我向前扫描以查找“\x06;”,将它们之间的内容存储为字符串,将所述字符串附加到列表中,然后在我找到的分号

我要做的是打开一个文件,然后找到“[\x06I”和“\x06;”的每个实例,然后返回两者之间的任何内容

由于这不是一个标准文本文件(它是RPG maker中的地图数据),readline()将无法满足我的需要,因为该文件的格式根本没有使我想要的数据总是整齐地放在一行之内

我现在正在做的是用read()将文件加载到一个列表中,然后简单地从一开始就删除字符,直到我点击字符串“[\x06I”。然后我向前扫描以查找“\x06;”,将它们之间的内容存储为字符串,将所述字符串附加到列表中,然后在我找到的分号后的字符处继续

这是可行的,我最终得到了我想要的,但我觉得这是最糟糕的方法。有没有更有效的方法

我的相关代码:

while eofget == 0:

    savor = 0
    while savor == 0 or eofget == 0:
        if line[0:4] == '[\x06I"':
            x = 4
            spork = 0
            while spork == 0:
                x += 1
                if line[x] == '\x06':
                    if line[x+1] == ';':
                        spork = x
                        savor = line[5:spork] + "\n"
                        line = line[x+1:]
                        linefinal[lineinc] = savor
                        lineinc += 1
                elif line[x:x+7] == '@widthi':
                    print("eof reached")
                    spork = 1
                    eofget = 1
                    savor = 0
        elif line[x:x+7] == '@widthi':
            print("finished map " + mapname)
            eofget = 1
            savor = 0
            break
        else:
            line = line[1:]
你可以忽略变量名。当我这样一次性完成时,我首先想到的就是命名。是的,我知道其中的一些东西没有任何意义,但我正在为完成代码保存清理

当eofget被翻转时,此子例程终止,并加载下一个映射。然后它重复执行。'@widthi'检查基本上是为了节省时间,因为它存在于每个映射中,并指示映射数据的开始,即我不关心的数据。

我将使用split()


我觉得这是使用正则表达式的自然情况。使用该方法:

正则表达式字符串
'\[\x06I'(.+?)\x06;'
可以解释如下:

尽可能少地匹配(由
表示)由
“[\x06I”
”\x06;“
包围的数量不确定的未指定字符(由
+
表示),只返回所附文本(由
周围的括号表示)


在编译中添加会使
也匹配换行符,从而允许捕获多行文本。

可以附加一些输入字符串示例吗?如何使用
read()
读取列表?您说
readlines()
不合适。您是否总是希望有一个“[\x06I”的实例'后接'\x06;'的实例,或者是否存在'[\x06I''的实例,并且直到文件末尾都不存在相应的'\x06;'。cdarke:readline()不适合,因为它查找换行符。此文件中确实存在换行符,但它们并不特定,通常会分割我需要的数据。这是尝试将文本文件逻辑应用于专有代码的结果。zehnpaard:是的,“[\x06I”'标记似乎表示任何数量的事物,因此完全依赖它是不安全的。事实上,我发现一些实例,即使使用'\x06;'标记,我也会得到一些不需要的数据。我真的不知道为什么,但它非常罕见,可以接受。你知道,我不知怎的忘记了拆分会拆分标定器的每个实例(或者不管这个词是什么),不仅仅是第一个。这是一个比我做的好得多的解决方案。我最终使用了上面的regex选项,这样我就可以练习使用regex,但是对于任何一个偶然发现这个问题的人来说,这是一个同样有效的答案。regex与split的优点是什么?我听到人们一直在提倡regex,但对我来说,这在很大程度上是多余的我是新手,所以我猜我错了。我肯定不是“一直倡导正则表达式”阵营的成员,因为它经常会陷入不可读的代码中。但在这种情况下,我认为主要的好处是简洁(次要的好处)和代码的声明性(主要的好处).terness,因为它是一段非常短的代码片段,如果您熟悉正则表达式,那么编写它实际上只需要很少的时间。声明性的,因为正则表达式字符串只表达您希望输出的内容,并将实际机制留给正则表达式引擎。
fulltext = 'adsfasgaseg[\x06I"thisiswhatyouneed\x06;sdfaesgaegegaadsf[\x06I"this is the second what you need \x06;asdfeagaeef'

parts = fulltext.split('[\x06I"')        # split by first label
results = []
for part in parts:                       
   if '\x06;' in part:                   # if second label exists in part
      results.append(part.split('\x06;')[0])  # get the part until the second label

print results
>>> s = 'testing[\x06I"text in between 1\x06;filler text[\x06I"text in between 2\x06;more filler[\x06I"text in between \n with some line breaks \n included in the text\x06;ending'

>>> import re
>>> p = re.compile('\[\x06I"(.+?)\x06;', re.DOTALL)
>>> print(p.findall(s))
['text in between 1', 'text in between 2', 'text in between \n with some line breaks \n included in the text']