2011-12-02 9 views
7

Napisz prosty program, który odczytuje linię z klawiatury i wypisuje tę samą linię, gdzie każde słowo jest odwrócone, . Słowo jest zdefiniowane jako ciągła sekwencja znaków alfanumerycznych lub łącznika ("-"). Na przykład, jeśli wejście jest „Czy możesz mi pomóc!” wyjście powinno być „NAC uoy pleh em!”String reverse in Python

Właśnie Próbowalismy z następującego kodu, ale istnieje jakiś problem z nim,

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

Drukuje "naC uoy pleh! Em", wystarczy spojrzeć na wykrzyknik (!), Jest to problem tutaj. Ktoś może mi pomóc ???

Odpowiedz

3

Można użyć re.sub(), aby znaleźć każde słowo i odwrócić go:

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

, co według mnie jest miłym sposobem. – phimuemue

+0

Należy zauważyć, że '' \ w'' symbolizuje znaki alfanumeryczne ** i podkreślenia **, podczas gdy OP nie zdefiniował słowa jako potencjalnie zawierającego podkreślenie – eyquem

-1

możesz to zrobić.

print"Enter the string:" 

str1=raw_input() 

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

lub wtedy, to

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

wyjście byłoby dokładnie tak, jak co PO ma już: "NAC uoy pleh em!". –

6

Najłatwiej jest prawdopodobnie użyć modułu re podzielić ciąg:

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

Po uruchomieniu pojawi się:

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

To nie działa poprawnie w przypadku łańcucha zawierającego łączniki. Myślę, że wzór powinien zostać zmieniony na re.compile ('([^ \ w \ -])') –

+0

'' (\ W +) '' byłoby lepsze niż '' (\ W) '' - Zwróć uwagę, że \ W symbolizuje inne znaki niż znaki alfanumeryczne i podkreślenia, podczas gdy OP nie zdefiniował słowa jako potencjalnie zawierającego podkreślenie – eyquem

0

Moja odpowiedź, bardziej gadatliwa. Obsługuje więcej niż jeden znak interpunkcyjny na końcu, a także znaki interpunkcyjne w zdaniu.

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

Proste rozwiązanie bez użycia modułu re:

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