如何在re.sub中更改原始匹配项

时间:2017-04-08 12:05:49

标签: python html regex python-2.7

我想使用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) 

你知道怎么做吗?

2 个答案:

答案 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)