如何用正则表达式替换为python中的小写
问题描述:
我想搜索关键词(键将是动态的)并以特定格式替换它们。例如: 这些数据如何用正则表达式替换为python中的小写
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标志。
答
您可以使用一个函数来做到的更换:
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)
答
没有必要使用正则表达式
>>> 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
答
从你提出的解决方案,我想我并不需要保持键作为一个列表(我将使用一组,以加快搜索速度)。这个答案也假定文本中的所有单词都被一个空格分隔(我将用它来加入它们)。给这些,你可以使用:
>>> 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)'
没有必要为不传递更多信息,任何额外的标记,zomboid – SilentGhost 2010-04-15 10:35:38
*正则表达式*是Stack Overflow上正则表达式的标签。 – Gumbo 2010-04-15 10:36:11