¿Hay una manera simple de eliminar todos los caracteres de una cadena dada que coincidan con una expresión regular dada? Sé que en Ruby puedo usar gsub:

>> key = "cd baz ; ls -l"
=> "cd baz ; ls -l"
>> newkey = key.gsub(/[^\w\d]/, "")
=> "cdbazlsl"

¿Cuál sería la función equivalente en Python?

4
Chris Bunch 16 ago. 2009 a las 21:08

5 respuestas

La mejor respuesta
import re
re.sub(pattern, '', s)

Docs

13
SilentGhost 16 ago. 2009 a las 17:13

Puede ser el camino más corto:

In [32]: pattern='[-0-9.]'
   ....: price_str="¥-607.6B"
   ....: ''.join(re.findall(pattern,price_str))
Out[32]: '-607.6'
0
Alexander 26 sep. 2016 a las 16:02
import re
old = "cd baz ; ls -l"
regex = r"[^\w\d]" # which is the same as \W btw
pat = re.compile( regex )
new = pat.sub('', old )
2
Jochen Ritzel 16 ago. 2009 a las 17:15

re.subn () es tu amiga:

>>> import re
>>> key = "cd baz ; ls -l"
>>> re.subn(r'\W', "", key)
('cdbazlsl', 6)
>>> re.subn(r'\W', "", key)[0]
'cdbazlsl'

Devuelve una tupla. Tome el primer elemento si solo desea la cadena resultante. O simplemente llame a re.sub (), como señala SilentGhost. (Es decir, su respuesta es más exacta).

2
hughdbrown 16 ago. 2009 a las 17:31

Las respuestas hasta ahora se han centrado en hacer lo mismo que su código Ruby, que es exactamente lo contrario de lo que está preguntando en la parte en inglés de su pregunta: el código elimina los caracteres que sí coinciden, mientras que su texto solicita

Una forma sencilla de eliminar todos los caracteres de una cadena dada que no coinciden

Por ejemplo, suponga que el patrón de su RE era r'\d{2,}', "dos o más dígitos", por lo que las partes que no coinciden serían todas no dígitos más todos los dígitos individuales y aislados. Eliminar las partes que NO coinciden, como lo requiere su texto, también es fácil:

>>> import re
>>> there = re.compile(r'\d{2,}')
>>> ''.join(there.findall('123foo7bah45xx9za678'))
'12345678'

Editar : OK, OP ha aclarado la pregunta ahora (realmente quiso decir qué decía su código, no su texto, y ahora el texto también es correcto ;-) pero dejo la respuesta para integridad (las otras respuestas que sugieren re.sub son correctas para la pregunta tal como está ahora). Me doy cuenta de que probablemente te refieres a lo que "dices" en tu código Ruby, y no a lo que dices en tu texto en inglés, pero, por si acaso, ¡pensé que sería mejor completar el conjunto de respuestas! -)

5
Alex Martelli 16 ago. 2009 a las 17:46