import sysimport osimport reimport numpy as np#Tags to remove, sample line: 1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....r122 = re.compile(':122:(.):')r194 = re.compile(':194:(.):')if len(sys.argv) < 2 : sys.exit('Usage: python %s <file2filter>' % sys.argv[0])if not os.path.exists(sys.argv[1]): sys.exit('ERROR: file %s not found!' % sys.argv[1])with open (sys.argv[1]) as f: for line in f: line = re.sub(r':122:(.):', '', str(line)) line = re.sub(r':194:(.):', '', str(line)) print(line,end=" ")在1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....出去1:one:2:two:....:122:twentytwo:....:194:ninetyfour:....標簽 122 和 194 不會被刪除。我在這里想念什么?
1 回答

楊魅力
TA貢獻1811條經驗 獲得超6個贊
您的模式包含(.)
匹配并捕獲除換行符以外的任何單個字符。您想要的是匹配除 之外的任何字符:
,因此您需要使用[^:]+
.
如果只有一部分正則表達式發生更改,則不需要編譯單獨的正則表達式對象。您可以在讀取文件之前動態構建正則表達式 abd 編譯一次。例如,您有122
,194
和945
值在:...:[^:]+:
模式中使用代替...
,那么您可以使用
vals = ["122", "194", "945"]
r = re.compile(r':(?:{}):[^:]+:'.format("|".join(vals)))
# Or, using f-strings
# r = re.compile(rf':(?:{"|".join(vals)}):[^:]+:')
正則表達式將如下所示 :(?:122|194|945):[^:]+:
:
:
- 一個冒號(?:122|194|945)
-非捕獲組匹配122
,194
或945
:
- 一個冒號[^:]+
- 1+ 字符而不是 a:
:
- 一個冒號
然后使用
with open (sys.argv[1], 'r') as f: for line in f: print(r.sub('', line))
添加回答
舉報
0/150
提交
取消