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

2024-05-16 07:54:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些坏掉的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不支持这一点。我试过这个regexp:

text = re.sub(r'(who="#.*?")', r'\L\1', text)

但结果是:

<sp \Lwho="#FERN">

这不是我想要的。。。有什么需要帮忙的吗,亲爱的stackoverflowers?提前谢谢!你知道吗


Tags: text文档示例sinxmlsplaun
1条回答
网友
1楼 · 发布于 2024-05-16 07:54:48

您可以在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="#注意,regex中的\b称为单词边界,它匹配单词和非单词字符,反之亦然。括号(pattern)用于捕获与括号内的模式匹配的字符。所以第一组包含who="#

  • ([^"]*)匹配任何字符,但不匹配"中的任何字符,零次或多次。所以这应该捕获FERN

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

相关问题 更多 >