2012-12-07 59 views
0

我有一個這樣的字符串:找到數字並更換

This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip 
This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip 

在這方面,我想替換我試過的數字或數字(有的時候數字是十六進制的也可以)與「my_doc」 :

match = re.findall("[\.0-9]*",text) 
print match 

但它的數字或數字唯一的工作,它也應該適用於十六進制數,代之以「my_doc」的數量和打印整線 輸出:

This changes are related to book:id:pages:my_doc location /file1/file2/file3/pages.my_doc.zip 
This changes are related to book:id:pages:my_doc location /file1/file2/file3/pages.my_doc.zip 

回答

1

你可以嘗試這樣的事:

In [8]: import re 


In [14]: strs="This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip" 

In [15]: re.findall(r"\d+[A-Ea-e]{0,}\d+[A-Ea-e]{0,}",strs) 

Out[15]: ['3000', '000'] 

In [16]: strs1="This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip" 

In [17]: re.findall(r"\d+[A-Ea-e]{0,}\d+[A-Ea-e]{0,}",strs1) 

Out[17]: ['30ab00e', '000'] 

使用re.sub()更換:

In [68]: strs="This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip" 

In [69]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",strs) 

Out[69]: 'This changes are related to book:id:pages:my_doc location /filemy_doc/filemy_doc/filemy_doc/pages.my_doc.zip' 

In [70]: strs1="This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip" 

In [71]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",strs1) 
Out[71]: 'This changes are related to book:id:pages:my_doc location /filemy_doc/filemy_doc/filemy_doc/pages.my_doc.zip' 

In [72]: foo=" number of pages completed, 2 still pending" 

In [73]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",foo) 
Out[73]: ' number of pages completed, my_doc still pending' 
+0

但在這相同的正則表達式將會無效:完成頁數,2仍然懸而未決我想打一個共同的,這將在所有的數字和小數點六也工作....我怎麼能代替它,得到上述 –

+0

提到@SuryaGupta您可以用'應用re.sub()的輸出'這裏得到預期的輸出,並在這兩個你所提到的例子工作。 –

+0

我同意...但我希望有一個共同的正則表達式將在所有包含數字和六號碼,但遺憾的是它不工作在這個字符串的字符串工作「完成的頁數,2仍懸而未決」 –

0

這是瘋了(所以你的問題)和hackish!

十六進制字符(A-Z,A-Z)出現在字符串在很多地方,所以這些將被替換其中(認爲問題並不ATM對象;))似乎並沒有預期的行爲。

假定要刪除的斑點/部分的十六進制字,並假設它的最小長度是3,考慮:

import re 
from string import hexdigits 


str_1 = "This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip" 

str_2 = "This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip" 

expression = '[%s]{3,}'%(string.hexdigits) # = '[' + hexdigits + ']{3,}' 
re.sub(exp, 'my_doc', str_1) 

編輯:好少有點瘋狂的正則表達式,使用下列表達式

expression = ':[%s]+\S'%(hexdigits) 

這將只匹配十六進制字,所以十六進制+數字的長度不再是一個約束。