我想使用html
标记在<br>
中分割文字。如果文本超过50个字符,我想在<br>
之前用10个字符替换最后一个空格。
文字位于<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)
你知道怎么做吗?
答案 0 :(得分:0)
re.sub
的替换参数可以是一个带有&#34;匹配对象的函数&#34;并返回更换。您可以使用匹配的字符串进行任何转换。
def replace_text(m):
return '<span class="value">' + divide_text(m.group(1)) + '</span>'
re.sub(r'<span class="value">(.*?)</span>', replace_text)
注意当输入不仅仅包含字符串<span class="value">
时,使用HTML解析库可以更好地控制,例如
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>
答案 1 :(得分: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)