2017-04-08 41 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) 
相关问题