2010-04-15 4 views
6

Je veux rechercher des mots-clés (les clés seraient dynamiques) et les remplacer dans un certain format. Par exemple: ces donnéesComment remplacer par une expression régulière en minuscules en python

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

devaient être converties en

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

Voici mon code:

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) 

Et cela fonctionne très bien, que je ne peux pas convertir dernier paramètre en minuscules. Cela convertit comme ceci:

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

comment puis-je convertir le dernier paramètre en minuscules? il semble que python ne peut pas compiler le signe \ L.

+0

il n'y a pas besoin de toutes les balises supplémentaires qui ne véhiculent pas plus d'informations, Zomboid – SilentGhost

+0

* regex * est le tag pour les expressions régulières ici sur Stack Overflow. – Gumbo

Répondre

10

Vous pouvez utiliser une fonction pour faire le remplacement:

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

pas nécessaire d'utiliser regex

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

A partir de votre solution proposée, je suppose que je ne ai pas besoin de garder les clés comme une liste (je vais utiliser un ensemble, pour faire une recherche plus rapide). Cette réponse suppose également que tous les mots du texte sont séparés par un espace (que je vais utiliser pour les rejoindre). Donnez-les, vous pouvez utiliser:

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

Accordé, cela appelle word.lower() deux fois. Vous pouvez éviter cela (et toujours utiliser une approche similaire) en utilisant deux compréhensions de liste (ou, en fait, les expressions du générateur):

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