我有一些破碎的XML(示例没有被破坏,但文档是这样的),其中一部分看起来像这样:
<sp who="#FERN">
<speaker>FERNANDO</speaker>
<p>Un instante. Soy un hombre. Huir sería cobarde... ¡Sin defenderse! ¡Sin salvarte!... Va a venir... con la vara del guardia. ¡Ay, que ya la conoces! ¡Ah, maldito!... ¡Y me dices que ese hombre es bueno!...</p>
</sp>
我想将属性who的值转换为小写:
<sp who="#fern">
通常我在正则表达式中使用函数\ U和\ L,但我认为python不支持。我试过这个正则表达式:
text = re.sub(r'(who="#.*?")', r'\L\1', text)
但输出是:
<sp \Lwho="#FERN">
这不是我想要的......任何帮助,亲爱的stackoverflowers?提前谢谢!
答案 0 :(得分:1)
您可以在re.sub
>>> s = '''<sp who="#FERN">
<speaker>FERNANDO</speaker>
<p>Un instante. Soy un hombre. Huir sería cobarde... ¡Sin defenderse! ¡Sin salvarte!... Va a venir... con la vara del guardia. ¡Ay, que ya la conoces! ¡Ah, maldito!... ¡Y me dices que ese hombre es bueno!...</p>
</sp>'''
>>> print re.sub(r'\b(who="#)([^"]*)', lambda m: m.group(1) + m.group(2).lower(), s)
<sp who="#fern">
<speaker>FERNANDO</speaker>
<p>Un instante. Soy un hombre. Huir sería cobarde... ¡Sin defenderse! ¡Sin salvarte!... Va a venir... con la vara del guardia. ¡Ay, que ya la conoces! ¡Ah, maldito!... ¡Y me dices que ese hombre es bueno!...</p>
</sp>
>>>
说明:
如果要对捕获的字符应用某些操作,则必须在re.sub
的替换部分中使用lambda函数。
\b(who="#)
匹配精确字符串who="#
请注意,正则表达式中的\b
称为字边界,在字和非字字符之间匹配,反之亦然。并且括号(pattern)
用于捕获与括号内的模式匹配的字符。因此,第一组包含who="#
([^"]*)
匹配任何字符但不匹配"
,零次或多次。所以这应该捕获FERN
。
在替换部分,我只返回第一组+降低第二组。