我有一个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和名字。)这是我心中的一系列复杂步骤,我希望有人可以帮助我或指导我走正确的道路
答案 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
将包含所有块。