2017-02-22 86 views
1

我試圖找出如何通過<p>TEXT</p>標籤,以取代所有<a href....>TEXT</a>標籤。如何通過替換另一個類型的標籤(<a ...>..</a> =><p>..</p>)

我已經開始尋找<a href...></a>的模式,因此我可以相應地替換它們。不幸的是,它似乎不匹配最接近的字符串。

>>> s = '<td class="tt"><a href="#">Alert types</a></td>&#13;<td class="info">Vibration</td>&#13;  </tr><tr><td class="tt"><a href="#">Sound</a>' 

>>> re.sub('<a h.*>','<p>',s) 

回報

'<td class="tt"><p>' 

代替:

'<td class="tt"><p>Alert types</a></td>&#13;<td class="info">Vibration</td>&#13;  </tr><tr><td class="tt"><p>Sound</a>' 

你知道如何使它匹配.*之間的最近字符串?

+0

您正則表達式有'H *'所以任何東西,嘗試'] *>' – depperm

+1

使用HTML解析器和串行像[LXML(HTTP:/ /lxml.de/lxmlhtml.html#examples)。 – Ryan

+0

你真的想[使用正則表達式來解析HTML?](http://stackoverflow.com/a/1732454/6499571) –

回答

3

用下面的辦法:

s = '<td class="tt"><a href="#">Alert types</a></td>&#13;<td class="info">Vibration</td>&#13;  </tr><tr><td class="tt"><a href="#">Sound</a>' 
replaced = re.sub(r'<a[^>]+?>([\w\W]+?)<\/a>', r'<p>\1</p>', s) 

print(replaced) 

輸出:

<td class="tt"><p>Alert types</p></td>&#13;<td class="info">Vibration</td>&#13;  </tr><tr><td class="tt"><p>Sound</p> 
0

不能確定它是否是一個好主意,或者是不使用正則表達式來做到這一點。但是,如果你喜歡的正則表達式,那麼這就是:

re.sub('<a [^>]*>([^<]*)</a>','<p>\\1</p>',s) 

使用([^<]*)它捕獲a標籤之間的文本和替換它用組作爲\\1

0

這應該工作。

搜尋:

(<.+?>)(.+)(<.+?>) 

輸入:

<a href="#">Sound</a> 

替換:

<p>$2</p> 

輸出:

<p>Sound</p> 

Python代碼:

# coding=utf8 
# the above tag defines encoding for this document and is for Python 2.x compatibility 

import re 

regex = r"(<.+?>)(.+)(<.+?>)" 

test_str = "<a href=\"#\">Sound</a>" 

subst = "<p>$2</p>" 

# You can manually specify the number of replacements by changing the 4th argument 
result = re.sub(regex, subst, test_str, 0, re.MULTILINE) 

if result: 
    print (result) 

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution. 

參見:https://regex101.com/r/j4OsbX/1

相關問題