2012-11-29 54 views
3

我試圖在python中實現以下替換。替換{N} &創建的哈希值[標籤,{N}]
原始字符串中的所有HTML標籤 - 「<h>這是一個字符串</H><P>這是另一部分</P>。」>
替換文本 - >「{ 0}這是一個字符串。{1} {2}這是另一部分。{3}「python替換模式與序列號字符串

這是我的代碼。我已經開始與更換,但我被困在更換邏輯,因爲我想不出來代替以連續的方式,即用各種情況下,最好的方法{0},{1}等:

import re 
text = "<h> This is a string. </H><p> This is another part. </P>" 

num_mat = re.findall(r"(?:<(\/*)[a-zA-Z0-9]+>)",text) 
print(str(len(num_mat))) 

reg = re.compile(r"(?:<(\/*)[a-zA-Z0-9]+>)",re.VERBOSE) 

phctr = 0 
#for phctr in num_mat: 
# phtxt = "{" + str(phctr) + "}" 
phtxt = "{" + str(phctr) + "}" 
newtext = re.sub(reg,phtxt,text) 

print(newtext) 

有人可以幫助更好地實現這一目標嗎?謝謝!

回答

2
import re 
import itertools as it 

text = "<h> This is a string. </H><p> This is another part. </P>" 

cnt = it.count() 
print re.sub(r"</?\w+>", lambda x: '{{{}}}'.format(next(cnt)), text) 

打印

{0} This is a string. {1}{2} This is another part. {3} 

可以用於簡單的標籤只(無屬性/代碼中有空格)。對於擴展標籤,您必須修改正則表達式。

此外,不重新初始化cnt = it.count()將繼續進行編號。

UPDATE得到映射字典:

import re 
import itertools as it 

text = "<h> This is a string. </H><p> This is another part. </P>" 

cnt = it.count() 
d = {} 
def replace(tag, d, cnt): 
    if tag not in d: 
     d[tag] = '{{{}}}'.format(next(cnt)) 
    return d[tag] 
print re.sub(r"(</?\w+>)", lambda x: replace(x.group(1), d, cnt), text) 
print d 

打印:

{0} This is a string. {1}{2} This is another part. {3} 
{'</P>': '{3}', '<h>': '{0}', '<p>': '{2}', '</H>': '{1}'} 
+0

哇!非常感謝你。我需要更多地瞭解lamda。謝謝你介紹給我。 :) 你還可以幫助我展示創建散列/字典的最佳方法:將字符串替換爲替換字符串,即{'':'{1}','':'{2 }'} 我正在做的是 - 在循環中找到匹配的所有匹配,並迭代放入字典中。只是想知道更有效的方式 - 查看代碼 – Ans

+0

@Ans的樣式,請參閱更新。 – eumiro

+0

對不起,延遲迴復。非常感謝你! – Ans