如何在Python中使用正则表达式替换为小写
我想要搜索一些关键词(这些关键词是动态的),并把它们替换成特定的格式。例如:
keys = ["cat", "dog", "mouse"]
text = "Cat dog cat cloud miracle DOG MouSE"
这些数据
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 个回答
2
根据你提出的解决方案,我可以假设我不需要把键保留为一个列表(我会用集合,这样查找会更快)。这个答案还假设文本中的所有单词都是用空格分开的(我会用这个来把它们重新连接起来)。基于这些,你可以使用:
>>> 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)'
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
11
你可以用一个函数来进行替换:
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)