所以,我有一個包含在 {} 括號中的各種條目的檔案。例子:
{
"classname" "waypoint"
"targetname" "w1"
"target" "w2"
"origin" "672 -1432 32"
"target2" "w9"
}
{
"classname" "light"
"light" "500"
"scale" "4"
"origin" "672 -1440 232"
}
{
"classname" "NPC_Tavion"
"angle" "180"
"origin" "860 -1092 -8"
}
{
"classname" "info_player_start"
"angle" "360"
"origin" "312 -1080 216"
}
{
"classname" "light"
"light" "500"
"scale" "4"
"origin" "320 -1304 232"
}
如果找到單詞 NPC_,我想洗掉 { } 本身旁邊的整個內容。所以我想要的結果是:
{
"classname" "waypoint"
"targetname" "w1"
"target" "w2"
"origin" "672 -1432 32"
"target2" "w9"
}
{
"classname" "light"
"light" "500"
"scale" "4"
"origin" "672 -1440 232"
}
{
"classname" "info_player_start"
"angle" "360"
"origin" "312 -1080 216"
}
{
"classname" "light"
"light" "500"
"scale" "4"
"origin" "320 -1304 232"
}
我找到了可以在 AWK 中完成的事情,但我只能使用 Windows 工具和/或 Python。我想出了類似的東西(好吧,我剛剛找到了另一個代碼片段并對其進行了修改):
bad_words = ['NPC_']
with open('oldfile.txt') as oldfile, open('newfile.txt', 'w') as newfile:
for line in oldfile:
if not any(bad_word in line for bad_word in bad_words):
newfile.write(line)
但是,我不知道如何使它包含 {} 中的其他內容。我發現了這個問題:洗掉 () 和 [] 之間的文本, 我發現類似的方法可以作業:
ret = ''
skip1c = 0
skip2c = 0
for i in test_str:
if i == '{':
skip1c = 1
elif i == '}' and skip1c > 0:
skip1c -= 1
elif skip1c == 0 and skip2c == 0:
ret = i
return ret```
But I have no idea how to mix the two :(
uj5u.com熱心網友回復:
你可以試試這個:
r"\{(.*?)\}"
并使用re.DOTALL:
re.DOTALL
制作“。” 特殊字符完全匹配任何字符,包括換行符;沒有這個標志,'.' 將匹配除換行符以外的任何內容。
如果包含“NPC_”,則提取大括號內的內容的代碼:
import re
with open('oldfile.txt') as oldfile:
newfile = oldfile.read()
res = re.findall(r"\{(.*?)\}", newfile, re.DOTALL)
with open('newfile.txt', 'w') as newfile:
for data in res:
if 'NPC_' not in data:
newfile.write('{' data '}\n')
uj5u.com熱心網友回復:
讓s您的字串包含檔案的內容。
out = ''.join('{' g for g in s.split('{') if 'NPC_' not in g and len(g) > 1)
不使用正則運算式的單行。它g通過將字串拆分為{. 如果組包含NPC_或為空拆分,則輸出將忽略它。''.join(..)將繩子縫合在一起。
這種 Python 結構稱為生成器運算式,并充當構建串列或其他可迭代物件的 for 回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420671.html
標籤:
上一篇:DartRegEx沒有拆分字串
下一篇:正則運算式核苷酸搜索
