在Python中,如何在文件中找到文本块?

时间:2014-07-09 05:00:32

标签: python ascii textblock web-crawler

我有一个ASCII格式的文件,我想找到括号括起来的文本块,并从该文件中获取信息。这些块看起来像这样:

"material" "DmeMaterial"
{
    "id" "elementid" "12af09eb-3a16-42a9-93eb-a9081a056d6d"
    "name" "string" "BodyParts_diffuse"
    "mtlName" "string" "models/characters/background/punk_01/BodyParts_diffuse"
}

我可以使用以下代码加载文件并在控制台中打印数据:

filePath = "F:\SteamLibrary\SteamApps\common\SourceFilmmaker\content_custom\mod_dmx\material_test.dmx"

with open(filePath, "r+") as f:
    data = f.read()
    print data
    f.close()

但我想抓住文字并找到"材料" " DmeMaterial"然后抓住括号之间的信息(特别是mtlName和名字。)这是我心中的一系列复杂步骤,我希望有人可以帮助我或指导我走正确的道路

2 个答案:

答案 0 :(得分:0)

正则表达式始终是格式化数据的选择。正则表达式适合您的示例,但没有关于您的数据的进一步信息我不能确定。如果它适合你的情况。

  

(“[\ w - ] +”)(“[\ w - ] +”)\ s * {\ n(\ s *(“[\ w - /] +”)(“[\ w- /] +“)   ( “[\ W - /] +”)\ n)的+}

此代码适用于您的示例:

import re
my_regex=re.compile('("[\w-]+") ("[\w-]+")\s*\{\n(\s*("[\w\-/]+") ("[\w\-/]+") ("[\w\-/]+")\n)+\}')
my_regex.findall(my_string)

PS:如果您不想捕获引号,请将它们移出括号,例如从(“[\ w - ] +”)“([\ w - ] + )“

答案 1 :(得分:0)

这是一种解决方法:

filePath = 'F:\SteamLibrary\SteamApps\common\SourceFilmmaker\content_custom\mod_dmx\material_test.dmx'
data_list = []

with open(filePath, "r+") as f:
data = f.read()
marker, pos = '"material" "DmeMaterial"', 0
while data.find(marker) != -1:  # Loops as long as the marker is present
    pos = data.find(marker)     # Finds first occurrence of marker
    start = data.find('{', pos) # Finds first occurrence of { after marker
    stop = data.find('}', pos)  # Finds first occurrence of } after marker
    data_list.append(data[start : stop+1].replace('\n', ''))
    data = data[stop+1:]

data_list将包含所有块。