re

2017-04-08 7 views
0

のオリジナルマッチを変更するにはhtmlのテキストを<br>タグで分割したいと思います。テキストが50文字より長い場合は、最後のスペースを10文字の前に置き換えます(<br>)。re

テキストは、例えば<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の置換引数は、 "一致オブジェクト"を取り、置換を返す関数とすることができます。これで、一致した文字列を使って変換できます。入力だけで、例えば、正確に文字列<span class="value">が含まれていない場合にHTML構文解析ライブラリを使用して

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

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

注意がはるかに優れたコントロールを提供します

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)