Eliminar caracteres del principio y final o solo final de línea

Quiero eliminar algunos símbolos de una cadena usando una expresión regular, por ejemplo:

== (que ocurre tanto al principio como al final de una línea),

* (al comienzo de una línea SOLAMENTE).

 def some_func(): clean = re.sub(r'= {2,}', '', clean) #Removes 2 or more occurrences of = at the beg and at the end of a line. clean = re.sub(r'^\* {1,}', '', clean) #Removes 1 or more occurrences of * at the beginning of a line. 

¿Qué pasa con mi código? Parece que las expresiones están mal. ¿Cómo elimino un carácter / símbolo si está al principio o al final de la línea (con una o más apariciones)?

Si solo desea eliminar los caracteres del principio y el final, puede utilizar el método string.strip() . Esto daría un código como este:

 >>> s1 = '== foo bar ==' >>> s1.strip('=') ' foo bar ' >>> s2 = '* foo bar' >>> s2.lstrip('*') ' foo bar' 

El método de strip elimina los caracteres dados en el argumento desde el principio y el final de la cadena, ltrip elimina solo desde el principio y rstrip elimina solo desde el final.

Si realmente quieres usar una expresión regular, se verían así:

 clean = re.sub(r'(^={2,})|(={2,}$)', '', clean) clean = re.sub(r'^\*+', '', clean) 

Pero en mi humilde opinión, usar strip / lstrip / rstrip sería lo más apropiado para lo que quieres hacer.

Edit: En la sugerencia de Nick, aquí hay una solución que haría todo esto en una línea:

 clean = clean.lstrip('*').strip('= ') 

(Un error común es pensar que estos métodos eliminan los caracteres en el orden en que aparecen en el argumento; de hecho, el argumento es solo una secuencia de caracteres que se eliminarán, cualquiera sea su orden, por eso la .strip('= ') eliminaría cada’ = ‘y’ ‘desde el principio y el final, y no solo la cadena’ = ‘.)

Tienes espacios extras en tus expresiones regulares. Incluso un espacio cuenta como un personaje.

 r'^(?:\*|==)|==$' 

En primer lugar, debe prestar atención a los espacios antes de “{” … son significativos, por lo que el cuantificador en su ejemplo se aplica al espacio.

Para eliminar “=” (dos o más) solo al principio o al final, también necesita una expresión diferente … por ejemplo

 clean = re.sub(r'^(==+)?(.*?)(==+)?$', r'\2', s) 

Si no coloca “^” o “$”, la expresión puede coincidir en cualquier lugar (es decir, incluso en el medio de la cadena).

¿Y no sustituyendo sino manteniendo? :

 tu = ('======constellation==' , '==constant=====' , '=flower===' , '===bingo=' , '***seashore***' , '*winter*' , '====***conditions=**' , '=***trees====***' , '***=information***=' , '*=informative***==' ) import re RE = '((===*)|\**)?(([^=]|=(?!=+\Z))+)' pat = re.compile(RE) for ch in tu: print ch,' ',pat.match(ch).group(3) 

Resultado:

 ======constellation== constellation ==constant===== constant =flower=== =flower ===bingo= bingo= ***seashore*** seashore*** *winter* winter* ====***conditions=** ***conditions=** =***trees====*** =***trees====*** ***=information***= =information***= *=informative***== =informative*** 

Quieres de hecho

==== *** condiciones = ** para dar condiciones = **?

*** ==== cien ==== *** para dar cien ==== ***?

para el comienzo ? * *

Creo que el siguiente código hará el trabajo:

 tu = ('======constellation==' , '==constant=====' , '=flower===' , '===bingo=' , '***seashore***' , '*winter*' , '====***conditions=**' , '=***trees====***' , '***=information***=' , '*=informative***==' ) import re,codecs with codecs.open('testu.txt', encoding='utf-8', mode='w') as f: pat = re.compile('(?:==+|\*+)?(.*?)(?:==+)?\Z') xam = max(map(len,tu)) + 3 res = '\n'.join(ch.ljust(xam) + pat.match(ch).group(1) for ch in tu) f.write(res) print res 

¿Dónde estaba mi cerebro cuando escribí el RE en mi post anterior? O! O cuantificador no codicioso. *? antes == + \ Z es la solución real.