2017-04-08 45 views
0

我想使用<br>標記在我的html中拆分文本。如果文本長度超過50個字符,我想用<br>替換10個字符前的空格。如何更改re.sub中的原始匹配

的文本是<span class="value">TEXT</span>

例如<span class="value">cccc cc cccccc cccc cc c</span>

意志變成了:<span class="value">cccc cc<br>cccccc<br>cccc cc c</span>所以每行最多可以有10個字符。

我已經爲此創建了一個正則表達式,它可能會找到這樣的標籤,但無法弄清楚如何從匹配的組中提取文本,然後將其替換。

snippet = re.sub(r'<span class="value">(.*)<\/span>', 
       r'<span class="value">\1<\/span>'.(divide text using <br> tags) 

你知道該怎麼做嗎?

+2

Nooo ... do ** not **使用正則表達式解析,處理和生成XML/HTML。使用XPath,XSLT,BeautifulSoup,... –

回答

0

re.sub的替換參數可以是一個函數,它需要一個「匹配對象」並返回替換。您可以使用匹配的字符串進行任何轉換。

def replace_text(m): 
    return '<span class="value">' + divide_text(m.group(1)) + '</span>' 

re.sub(r'<span class="value">(.*?)</span>', replace_text) 

注意使用HTML解析庫給出了當輸入不只是正好包含字符串<span class="value">,例如更好地控制

import lxml.html 

document = lxml.html.fromstring('''<html><body> 
<span class="value">aaa</span> 
<span class=value>bbb</span> 
<span class="value-is-irrelevant">ccc</span> 
<span class="value should-match-this-too">ddd</span> 
</body></html>''') 

# http://stackoverflow.com/q/1604471/ 
elements = document.xpath("//span[contains(concat(' ', @class, ' '), ' value ')]") 
for element in elements: 
    element.text = element.text.upper() 
    # do your "divide text" here. 

print(lxml.html.tostring(document)) 
# <html><body> 
# <span class="value">AAA</span> 
# <span class="value">BBB</span> 
# <span class="value-is-irrelevant">ccc</span> 
# <span class="value should-match-this-too">DDD</span> 
# </body></html> 
0

這將跳過每10個字符的範圍。

import re 
snippet = re.sub(r'<span class="value">(.*?)<\/span>', lambda m: "<br>".join([m.group(1)[i:i+10] for i in range(0, len(m.group(1)), 10)]), """<span class="value">cccc cc cccccc cccc cc c</span>""") 
print(snippet) 
相關問題