2011-12-02 12 views
7

Escriba un programa simple que lea una línea del teclado y muestre la misma línea donde se invierte cada palabra. Una palabra se define como una secuencia continua de caracteres alfanuméricos o guión ('-'). Por ejemplo, si la entrada es “¿me pueden ayudar!” la salida debe ser “NAC uoy pleh em!”Cadena inversa en Python

acabo tryed con el siguiente código, pero hay algo malo en él,

print"Enter the string:" 
str1=raw_input() 
print (' '.join((str1[::-1]).split(' ')[::-2])) 

Imprime "naC uoy pleh! Em", solo mira la exclamación (!), Aquí está el problema. ¿Alguien puede ayudarme?

Respuesta

3

Puedes usar re.sub() para encontrar cada palabra y revertirla:

In [8]: import re 

In [9]: s = "Can you help me!" 

In [10]: re.sub(r'[-\w]+', lambda w:w.group()[::-1], s) 
Out[10]: 'naC uoy pleh em!' 
+0

que es una buena manera, en mi opinión. – phimuemue

+0

Tenga en cuenta que '' \ w'' simboliza caracteres alfanuméricos ** y guiones bajos ** mientras que OP no definió una palabra que posiblemente contenga un guión bajo – eyquem

-1

puede hacer esto.

print"Enter the string:" 

str1=raw_input() 

print(' '.join(str1[::-1].split(' ')[::-1])) 

o entonces, este

print(' '.join([w[::-1] for w in a.split(' ') ])) 
+0

la salida sería exactamente igual a lo que ya tiene OP: "NAC uoy pleh ellos!". –

6

La más sencilla es probablemente utilizar el módulo re a dividir la cadena:

import re 
pattern = re.compile('(\W)') 
string = raw_input('Enter the string: ') 
print ''.join(x[::-1] for x in pattern.split(string)) 

cuando es ejecutado, se obtiene:

Enter the string: Can you help me! 
naC uoy pleh em! 
+1

Esto no funciona correctamente en la cadena que contiene guiones. Creo que el patrón debería cambiarse a re.compile ('([^ \ w \ -])') –

+0

'' (\ W +) '' sería mejor que '' (\ W) '' - Tenga en cuenta que \ W simboliza otros caracteres además de caracteres alfanuméricos y guiones bajos, mientras que OP no definió una palabra como posiblemente conteniendo un guión bajo – eyquem

0

Mi respuesta, aunque más prolija. Maneja más de un signo de puntuación al final, así como los signos de puntuación dentro de la oración.

import string 
import re 

valid_punctuation = string.punctuation.replace('-', '') 
word_pattern = re.compile(r'([\w|-]+)([' + valid_punctuation + ']*)$') 

# reverses word. ignores punctuation at the end. 
# assumes a single word (i.e. no spaces) 
def word_reverse(w): 
    m = re.match(word_pattern, w) 
    return ''.join(reversed(m.groups(1)[0])) + m.groups(1)[1] 

def sentence_reverse(s): 
    return ' '.join([word_reverse(w) for w in re.split(r'\s+', s)]) 

str1 = raw_input('Enter the sentence: ') 
print sentence_reverse(str1) 
0

solución simple sin utilizar re módulo:

print 'Enter the string:' 
string = raw_input() 

line = word = '' 

for char in string: 
    if char.isalnum() or char == '-': 
     word = char + word 
    else: 
     if word: 
      line += word 
      word = '' 
     line += char 

print line + word