2010-04-15 9 views
6

Quiero buscar palabras clave (las claves serían dinámicas) y reemplazarlas en un formato determinado. Por ejemplo: estos datosCómo reemplazar por expresión regular a minúsculas en python

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

tenían que ser convertidos a

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

Aquí está mi código:

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) 

Y esto funciona bien, sólo que no puedo convertir último parámetro a minúsculas Esto se convierte así:

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

¿cómo puedo convertir el último parámetro a minúsculas? parece que Python no puede compilar el signo \ L.

+0

no hay ninguna necesidad de que las etiquetas adicionales que no transmiten más información, Zomboid – SilentGhost

+0

* regex * es la etiqueta para expresiones regulares aquí en Stack Overflow. – Gumbo

Respuesta

10

Se puede utilizar una función para hacer la sustitución:

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

hay necesidad de usar expresiones regulares

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

De la solución propuesta, supongo que no necesito para mantener las llaves como una lista (usaré un conjunto, para hacer la búsqueda más rápido). Esta respuesta también asume que todas las palabras en el texto están separadas por un espacio (que usaré para unirlas). Dé estos, puede usar:

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

Concedido, esto llama a word.lower() dos veces. Esto se puede evitar (y todavía utilizar un enfoque similar) usando dos listas por comprensión (o, en realidad, las expresiones generadoras):

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