2012-06-07 20 views
9

Estoy tratando de aprender Python, y soy bastante nuevo en esto, y no puedo entender esta parte. Básicamente, lo que estoy haciendo ahora es algo que toma el código fuente de una página web, y saca todo lo que no son palabras.No se puede obtener single en python

Las páginas web tienen un montón de \ ny \ t, y quiero algo que encuentre \ y elimine todo entre él y el siguiente ''.

def removebackslash(source): 
    while(source.find('\') != -1): 
     startback = source.find('\') 
     endback = source[startback:].find(' ') + startback + 1 
     source = source[0:startback] + source[endback:] 
    return source 

es lo que tengo. No funciona así, porque \' no cierra la cadena, pero cuando cambio \ a \\, interpreta la cadena como \\. No puedo entender nada que se interprete en '\'

+6

Esto se debe a que se debe evitar la barra invertida. De esta manera: 'source.find ('\\')'. – elmigranto

+5

Cree que \ n son 2 caracteres. No lo son, es solo uno, por lo que no se puede omitir todo entre \ yn o r porque tendrían que tener 2 caracteres. – uselpa

+0

Btw reloj para resaltar el código. En este caso, está mal, porque tu fuente está equivocada. Los indicadores secundarios como este son útiles para encontrar un error sin perder demasiado tiempo. –

Respuesta

18

\ es un carácter de escape; o le da a los personajes un significado especial o quita ese significado especial. En este momento, se está escapando de la comilla simple de cierre y la trata como una comilla simple literal. Debe escaparse consigo mismo para insertar una barra invertida literal:

def removebackslash(source): 
    while(source.find('\\') != -1): 
     startback = source.find('\\') 
     endback = source[startback:].find(' ') + startback + 1 
     source = source[0:startback] + source[endback:] 
    return source
+1

Esto es lo que leo en todas partes, pero cuando hago este cambio, busca en la fuente '\\'. – fnsjdnfksjdb

+2

@fnsjdnfksjdb: No, no es así. Realmente, pruébalo. http://codepad.org/BXherX82 – Ryan

+1

Lo probé. Luego incluso lo hice fuera de la función, para ver si el problema podía estar en otro lugar. Cuando imprimo una fuente [source.find ('\\'):] comienza con un \\. Cada vez. "blahblahblah \ andstuff" .find ('\\') evalúa a -1 para mí. – fnsjdnfksjdb

2

El auto-formato SO muestra su problema. Como se usa \ para escapar caracteres, se está escapando de las comillas finales. Intente cambiar esa línea (tenga en cuenta el uso de comillas dobles):

while(source.find("\\") != -1): 

Más información acerca de los caracteres de escape in the docs.

7

Trate de usar reemplazar:

str.replace(old, new[, count]) 

devolver una copia de la cadena con todas ocurrencias de subcadena antigua reemplazada por nueva. Si se proporciona el recuento de argumentos opcional, solo se reemplazan las primeras ocurrencias de recuento.

Así, en su caso:

my_text = my_text.replace('\n', '') 
my_text = my_text.replace('\t', '') 
3

Como han dicho otros, es necesario utilizar '\\'. La razón por la que piensas que esto no funciona es porque cuando obtienes los resultados, parece que comienzan con dos barras diagonales inversas. Pero no comienzan con dos barras diagonales inversas, es solo que Python muestra dos barras diagonales inversas. Si no fuera así, no podría distinguir entre una nueva línea (representada como \n) y una barra invertida seguida de la letra n (representada como \\n).

Hay dos maneras de convencerse de lo que realmente está pasando. Uno es utilizar la impresión en el resultado, lo que hace que se expanda los escapes:

>>> x = "here is a backslash \\ and here comes a newline \n this is on the next line" 
>>> x 
u'here is a backslash \\ and here comes a newline \n this is on the next line' 
>>> print x 
here is a backslash \ and here comes a newline 
this is on the next line 
>>> startback = x.find('\\') 
>>> x[startback:] 
u'\\ and here comes a newline \n this is on the next line' 
>>> print x[startback:] 
\ and here comes a newline 
this is on the next line 

Otra forma es utilizar len para verificar la longitud de la cadena:

>>> x = "Backslash \\ !" 
>>> startback = x.find('\\') 
>>> x[startback:] 
u'\\ !' 
>>> print x[startback:] 
\ ! 
>>> len(x[startback:]) 
3 

en cuenta que len(x[startback:]) es 3 La cadena contiene tres caracteres: barra invertida, espacio y signo de exclamación.Se puede ver lo que está pasando aún más simple con sólo mirar una cadena que contiene sólo una barra invertida:

>>> x = "\\" 
>>> x 
u'\\' 
>>> print x 
\ 
>>> len(x) 
1 

x solamente parece que comienza con dos barras invertidas cuando se evalúa que en el modo interactivo (o cualquier otro uso que es __repr__ método). Cuando realmente lo imprimes, puedes ver que es solo una barra invertida, y cuando miras su longitud, puedes ver que tiene solo un carácter de largo.

Lo que esto significa es que necesita escapar de la barra invertida en su find, y debe reconocer que las barras invertidas que se muestran en la salida también se pueden duplicar.

2

No creo que nadie haya mencionado esto todavía, pero si no quieres ocuparte de tener que escapar de los caracteres solo utiliza una cadena sin formato.

source.find(r'\') 

añadiendo la letra r antes de la cadena le dice a Python no interpretar caracteres especiales y mantiene la cadena tal y como lo escribe.

+0

Aún escapa al final de la cadena. – Ryan

Cuestiones relacionadas