如何在python中将正则表达式替换为小写

时间:2010-04-15 08:26:46

标签: python regex

我想搜索关键词(键是动态的)并以某种格式替换它们。例如: 这些数据

keys = ["cat", "dog", "mouse"]
text = "Cat dog cat cloud miracle DOG MouSE"

必须转换为

converted_text = "[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)"

这是我的代码:

keys = "cat|dog|mouse"
p = re.compile(u'\\b(?iu)(?P<name>(%s))\\b' % keys)
converted_text = re.sub(p, '[\g<name>](\g<name>)', text)

这样可以正常工作,但我无法将最后一个参数转换为小写。这样转换如下:

converted_text = "[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](DOG) [MouSE](MouSE)"

如何将最后一个参数转换为小写?看来python无法编译\ L标志。

3 个答案:

答案 0 :(得分:10)

您可以使用函数进行替换:

pattern = re.compile('|'.join(map(re.escape, keys)), re.IGNORECASE)
def format_term(term):
    return '[%s](%s)' % (term, term.lower())

converted_text = pattern.sub(lambda m: format_term(m.group(0)), text)

答案 1 :(得分:3)

无需使用正则表达式

>>> keys = ["cat", "dog", "mouse"]
>>> text = "Cat dog cat cloud miracle DOG MouSE"
>>> for w in text.split():
...     if w.lower() in keys:
...        print "[%s]%s" %(w,w.lower()),
...     else:
...        print w,
...
[Cat]cat [dog]dog [cat]cat cloud miracle [DOG]dog [MouSE]mouse

答案 2 :(得分:1)

从您提出的解决方案中,我假设我不需要将密钥保存为列表(我将使用一组,以便更快地进行搜索)。这个答案还假设文本中的所有单词都用空格分隔(我将用它们将它们连接起来)。给这些,你可以使用:

>>> keys = (["cat", "dog", "mouse"])
>>> text = "Cat dog cat cloud miracle DOG MouSE"
>>> converted =  " ".join(("[%s](%s)" % (word, word.lower()) if word.lower() in keys else word) for word in text.split())
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'

当然,这会调用word.lower()两次。你可以使用两个列表推导(或者实际上是生成器表达式)来避免这种情况(并且仍然使用类似的方法):

>>> converted =  " ".join(("[%s](%s)" % (word, lower) if lower in keys else word) for word, lower in ((w, w.lower()) for w in text.split()))
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'