我是正則運算式的新手。我已經閱讀了各種教程,但我仍然無法運行我的簡單代碼。
我的檔案被組織起來,例如"c1c2c4_aa_1", "c1c2c3_aa_2", "c1c2c8_aa_3", "c1c3c4_aa_4", ... "c1c2c4_bb_41", "c1c8c9_cc_58","c1c3c11_aa_19"
我想找到所有那些包含"aa"(例如"c1c2c3_aa_3")并將它們轉換為"c1c2c4_zz_3"
所以我希望“_”之前的最后一個數字和第一個字串保持固定,但改變中間的“aa”。
“c1”、“c2”、“c3”是一些條件。此外,最后一個數字是相當隨機的,所以我不知道它們來定義它們。
我有興趣使用正則運算式。
我試過這個:
con_list1 = ["c1", "c2", ... "c8"]
con_list2 = ["c1", "c2", ... "c11"]
con_list3 = ["c1", "c2", ... "c10"]
for con1 in con_list1:
for con2 in con_list2:
for con3 in con_list3:
if(os.path.exists("./" con1 con2 con3 "_aa(.*)")):
os.rename("./" con1 con2 con3 "_aa(.*)", "./" con1 con2 con3 "_zz(.*)")
我希望與我重命名的檔案相對應的最后一個數字保持不變:
“c1c2c3_aa_3”->“c1c2c3_zz_3”“c1c2c3_aa_13”->“c1c2c3_zz_13”
我也有興趣以正確的方式使用正則運算式和 (.*)。
但是,上面的代碼似乎不起作用。
我很感激幫助實作此代碼。
uj5u.com熱心網友回復:
如果您有類似的串列con_list1 = ["c1c2c4_aa_1", "c1c2c3_aa_2", "c1c2c8_aa_3", "c1c3c4_aa_4"],可以嘗試以下操作:
import re
con_list1 = ["c1c2c4_aa_1", "c1c2c3_aa_2", "c1c2c8_aa_3", "c1c3c4_aa_4"]
regex = r"_aa_"
for test_str in con_list1:
matches = re.finditer(regex, test_str, re.MULTILINE)
for match in matches:
result = match.groups()
if result:
test_str[match.start():] '_zz_' test_str[:match.end()]
但最簡單的方法是:
con_list1 = ["c1c2c4_aa_1", "c1c2c3_aa_2", "c1c2c8_aa_3", "c1c3c4_aa_4"]
for test_str in con_list1:
test_str .replace('_aa_', '_zz_')
uj5u.com熱心網友回復:
試試這個來找到所有的名字:“[a-z0-9] _aa_[0-9] ”
names = re.findall(r'\"[a-z0-9] \_aa\_[0-9] \"', files_names_list.text, flags=re.I))
files_names_list 是一個串列,其中包含所有檔案名
希望我正確理解你
uj5u.com熱心網友回復:
假設當前目錄中存在要重命名的檔案,請嘗試以下操作:
import os, re
for f in os.listdir('.'):
m = re.match(r'((?:c\d{1,2}){3})_aa_(\d{1,2})$', f)
if m:
newname = m.group(1) '_zz_' m.group(2)
os.rename(f, newname)
((?:c\d{1,2}){3})匹配三個重復c一個或兩個數字的集合。(\d{1,2})匹配一位或兩位數字。m.group(1)由于上面的正則運算式用括號括起來,匹配的子字串被m.group(2)單獨捕獲。
uj5u.com熱心網友回復:
您可以使用
import os, re
con_list1 = ["c1", "c2", "c3","c4","c5","c6","c7","c8"]
con_list2 = ["c1", "c2", "c3","c4","c5","c6","c7","c8", "c9","c10", "c11"]
con_list3 = ["c1", "c2", "c3","c4","c5","c6","c7","c8", "c9","c10"]
regex = re.compile(f'^((?:{"|".join(map(re.escape, con_list1))})(?:{"|".join(map(re.escape, con_list2))})(?:{"|".join(map(re.escape, con_list3))}))_aa_')
rootdir = "YOUR_ROOT_DIR"
for root, dirs, files in os.walk(rootdir):
for file in files:
if regex.search(file):
os.rename(file, regex.sub(r'\g<1>_zz_', file))
注意:os.walk()遞回搜索所有子目錄,如果您不需要該行為,請參閱Non-recursive os.walk()。
這不是創建動態模式的最有效方法(正則運算式 TRIE會更好),但它顯示了一種可行的方法。正則運算式看起來像
^((?:c1|c2|c3|c4|c5|c6|c7|c8)(?:c1|c2|c3|c4|c5|c6|c7|c8|c9|c10|c11)(?:c1|c2|c3|c4|c5|c6|c7|c8|c9|c10))_aa_
請參閱正則運算式演示。請注意,條件串列中的每個專案都是re.escaped 以確保特殊字符不會阻止您的檔案名匹配。
詳情:
^- 字串的開始((?:c1|c2|c3|c4|c5|c6|c7|c8)(?:c1|c2|c3|c4|c5|c6|c7|c8|c9|c10|c11)(?:c1|c2|c3|c4|c5|c6|c7|c8|c9|c10))- 第 1 組(\g<1>指該組值,如果_zz_不是以數字開頭的文本的占位符,您甚至可以使用\1):一個值 fromcon_list1,然后一個值 fromcon_list2,然后一個值 fromcon_list3_aa_- 一個_aa_固定的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525933.html
標籤:Pythonpython-3.x正则表达式细绳正则表达式替换
