使用Python将使用regexp搜索的字符串转换为小写

时间:2016-06-06 06:17:31

标签: python regex xml

我有一些破碎的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?提前谢谢!

1 个答案:

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

  • 在替换部分,我只返回第一组+降低第二组。