2015-12-01 36 views
0

我有一個Python的re.sub()問題。我的目標:Python的正則表達式:re.sub()進入輸入新的正則表達式作爲字符串

  • 通過文件名的文件名
  • interate在for循環中
  • 發現regex1的(RE1)與regex2替換(RE2)

我曾嘗試以下:

import re 

f_names = ["6000_3-22__data22_new.asc","99_23-2_B__report_22.pdf"] 

re1 = r"[0-9]+_[0-9]+-[0-9]+_" 
re2 = r"[0-9]+-[0-9]+-[0-9]+" 

for f in f_names: 
    f = re.sub(re1, re2, f) 
    print f 

其中字面意思是在字符串中的re2:

[0-9]+-[0-9]+-[0-9]+_data22_new.asc 
[0-9]+-[0-9]+-[0-9]+B__report_22.pdf 

我想看到什麼返回是:

6000-3-22_data22_new.asc 
99-23-2B__report_22.pdf 

我也使用re.compile作爲第一步,可以得到相同的結果嘗試。 當然,我必須錯過一些非常明顯的東西,但不能發現它。誰能幫忙?

謝謝!

回答

2

你所尋找的是capturing groups

>>> re1 = r"([0-9]+)_([0-9]+)-([0-9]+)_" 
>>> re2 = r"\1-\2-\3" 
>>> for f in f_names: 
...  f = re.sub(re1, re2, f) 
...  print f 
... 
6000-3-22_data22_new.asc 
99-23-2B__report_22.pdf 

它能做什麼?

因此,基本上當() pamentalhesis中包含一個模式時,正則表達式引擎會捕獲它們並保存以備後用。這是第一()匹配的子字符串將進入\1


如果你想有一個列表,你可以用list comprehension

>>> [ re.sub(re1, re2, f) for f in f_names ] 
['6000-3-22_data22_new.asc', '99-23-2B__report_22.pdf'] 
+1

爲正則表達式尼斯修復,_but_這不會在列表中更改值。 (我認爲這就是OP想要的)也許把這個和列表理解結合起來? –

+0

@tobias_k好點!我已經更新了列表理解的答案 – nu11p01n73R

+0

謝謝,我做了更改並嘗試了第一個選項和列表理解,但在兩個文件上都得到以下錯誤: 文件「C:\ Python27 \ lib \ sre_parse.py」 ,第833行,在expand_template中 引發錯誤,「無效組引用」 sre_constants.error:無效的組引用 – qwertysmack

相關問題