2010-04-15 35 views
6

我想搜索关键词(键将是动态的)并以特定格式替换它们。例如: 这些数据如何用正则表达式替换为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标志。

+0

没有必要为不传递更多信息,任何额外的标记,zomboid – SilentGhost 2010-04-15 10:35:38

+0

*正则表达式*是Stack Overflow上正则表达式的标签。 – Gumbo 2010-04-15 10:36:11

回答

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) 
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 
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)'