如何解决如何使用python脚本从文本文件中选择大括号内的有用信息?
我有一个巨大的文本文件,其中包含以这种格式存储的信息。
:x
title Zyorby Cleaner V2 \ ENB Remover
cls
if exist "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries" (
goto enbyes
) else (
if exist "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries" (
goto enbyes
) else (
if exist "C:\Program Files\Epic Games\GTAV\enbseries" (
goto enbyes
) else (
if exist "D:\Program Files\Epic Games\GTAV\enbseries" (
goto enbyes
) else (
goto enbno
)
)
)
)
:enbyes
rmdir /s /q "C:\Program Files\Epic Games\GTAV\enbseries"
del /s /q "C:\Program Files\Epic Games\GTAV\d3d11.dll"
del /s /q "C:\Program Files\Epic Games\GTAV\d3dcompiler_46e.dll"
del /s /q "C:\Program Files\Epic Games\GTAV\enbadaptation.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enbbloom.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enbeffect.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enbeffectpostpass.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enblens.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enblightsprite.fx"
del /s /q "C:\Program Files\Epic Games\GTAV\enblocal.ini""
del /s /q "C:\Program Files\Epic Games\GTAV\enbseries.ini"
rmdir /s /q "D:\Program Files\Epic Games\GTAV\enbseries"
del /s /q "D:\Program Files\Epic Games\GTAV\d3d11.dll"
del /s /q "D:\Program Files\Epic Games\GTAV\d3dcompiler_46e.dll"
del /s /q "D:\Program Files\Epic Games\GTAV\enbadaptation.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enbbloom.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enbeffect.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enbeffectpostpass.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enblens.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enblightsprite.fx"
del /s /q "D:\Program Files\Epic Games\GTAV\enblocal.ini"
del /s /q "D:\Program Files\Epic Games\GTAV\enbseries.ini"
rmdir /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\d3d11.dll"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\d3dcompiler_46e.dll"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbadaptation.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbbloom.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbeffect.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbeffectpostpass.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblens.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblightsprite.fx"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblocal.ini"
del /s /q "C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries.ini"
rmdir /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\d3d11.dll"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\d3dcompiler_46e.dll"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbadaptation.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbbloom.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbeffect.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbeffectpostpass.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblens.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblightsprite.fx"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enblocal.ini"
del /s /q "D:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V\enbseries.ini"
echo %DATE% %TIME% - ENB has been removed >> %userprofile%\Downloads\logs.txt
cls
echo.
echo ----------------------------------
echo - your ENB has been cleaned -
echo - to go back to the home screen: -
echo ----------------------------------
echo.
pause
goto main
:enbno
echo %DATE% %TIME% - could not find enbseries folder >> %userprofile%\Downloads\logs.txt
cls
echo.
echo --------------------------------------
echo - your ENB could not be found -
echo --------------------------------------
echo.
pause
goto main
我想使用 py 脚本遍历此文件并按以下格式构建 dict(或任何其他数据结构)。
例如。
someOtherMessage{
class = "someClass";
sampleMessage{
someValue{
someText{
someParam = "value";
someSymbol = "another_symbol";
}; //someText
}; //someValue
}; //sampleMessage
}; //someOtherMessage
someOtherMessage2{
class = "someClass2";
sampleMessage2{
someValue2{
someText2{
someParam = "value2";
someSymbol = "another_symbol2";
}; //someText2
}; //someValue2
}; //sampleMessage2
}; //someOtherMessage2
我使用了以下正则表达式,但它选择了第一个和最后一个大括号之间的所有内容,如何让它分别选择所需的?
解决方法
这是您的问题的可能解决方案之一。 我假设您了解贪婪和惰性量词。如果没有,这里是一个链接:Greedy vs. Reluctant vs. Possessive Qualifiers
(?s)\{(.*?)\};.*?(\n\n|$)
错误
在原始的正则表达式 (?s){(.*)}
中,您使用了贪婪量词,它匹配太多,因此导致匹配了我们不想要的东西。
如果你用一个惰性量词替换它,(?s){(.*?)}
,它匹配的太少又会导致匹配不想要的东西。
更正
为了指定更正结尾 }
,我们必须找到一些东西来锚定我们的匹配。这就是要获取的数据之间的新行发挥作用的地方。
}; //someOtherMessage
someOtherMessage2{
在该 \n
注释之后有一个 someOtherMessage
,然后在该新行中有另一个 \n
。所以我们添加
`(?s)\{(.*?)\};.*?\n\n`
这只是意味着{...something here...}...something here...\n\n
。
这个正则表达式仍然不会是结束数据,因为它最后没有任何 \n
。
}; //someOtherMessage2'
}
为了匹配它,我们通过删除 $
修饰符来设置 m
以匹配文件结尾。这会将我们的正则表达式更改为:
(?s)\{(.*?)\};.*?(\n\n|$)
我希望我能帮助你解决你的问题。请注意,这是您问题的可能解决方案之一。 还有另一种方法可以找到匹配的嵌套括号,它也可以在 SO 上使用。但是,它可能有点复杂。这是一个这样的链接:Can regular expressions be used to match nested patterns?
如果您有任何其他疑问,请务必提及。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。