2016-11-19 5 views
2

schrieb ich ein Programm, um die Worte in einem bestimmten Satz zu umkehren hier:Umkehren Worte in einem Python-String (einschließlich Interpunktion)

def rev_each_word_in(Sentence): 

print(' '.join(Word[::-1] for Word in Sentence.split())) 

Als mein Input für Satz I „verwendet, um zu sein oder nicht zu sein, dass ist die Frage." Dies gibt die folgenden:

ot eb ro ton ot eb taht si eht .noitseuq 

Es ist fast genau das, was ich will, aber ist es eine Möglichkeit, dass der Punkt am Ende des Satzes bleiben könnte, so die Rückkehr wäre:

ot eb ro ton ot eb taht si eht noitseuq. 

Thank Sie im Voraus!

+1

Also wollen Sie "nicht" zu "tno'd" werden? – DSM

+0

Möchten Sie im Wesentlichen alle Interpunktion in der gleichen Position bleiben? – ospahiu

Antwort

0

Ihre Methode, um diese Änderung:

def rev_each_word_in(Sentence): 
    if Sentence[-1] == '.': 
     Sentence = Sentence[:-1] 
     print(' '.join(Word[::-1] for Word in Sentence.split())+".") 
    else: 
     print(' '.join(Word[::-1] for Word in Sentence.split())) 
+0

Dies funktioniert nur für eine einzige Periode am Ende eines Satzes. – ospahiu

+0

Korrekt. Das scheint das zu sein, was das OP wollte. –

0
import string 

def reverse(sentence): 
    punctuation = set(string.punctuation) 
    words = [] 
    for word in sentence.split(): 
     words.append(word.rstrip(string.punctuation)[::-1]) 
     if word[-1] in punctuation: 
      words[-1] = words[-1]+word[-1] 
    return ' '.join(words) 

Ausgang:

In [152]: reverse("to be or not to be that is the question.") 
Out[152]: 'ot eb ro ton ot eb taht si eht noitseuq.' 

Und dies wird für jede Interpunktion in Ihrem Satz arbeiten:

In [153]: reverse("to be or not to be; that is the question.") 
Out[153]: 'ot eb ro ton ot eb; taht si eht noitseuq.' 
1

Hier einige kommt Hässlichkeit, die sich in einer Zeile darum kümmert:

from string import punctuation as p 
print(' '.join(w[::-1] if w[-1] not in p else w[:-1][::-1] + w[-1] for w in Sentence.split())) 

Wo sind wir voll und ganz, wenn das letzte Zeichen in einem Wort umkehren nicht in der Satzzeichenfolge ist, und wenn es wir umkehren die Zeichenfolge bis zum Interpunktion ist und dann die Interpunktion, um es hinzuzufügen. druckt:

ot eb ro ton ot eb taht si eht noitseuq. 

Abnehmen es so viel wie ich kann, weil ich bin davon beschämt:

# similar to [::-1] 
r = slice(None, None,-1) 
# cut down chars!  
l = Sentence.split() 
# reverse condition too and use shorter names 
print(' '.join(w[:-1][r] + w[-1] if w[-1] in p else w[r] for w in l)) 
1

Ihre Spezifikationen sind noch unklar, aber wenn man nur die Buchstaben umgekehrt werden wollen innerhalb ein Wort, vielleicht könnten Sie so etwas wie

def reverse_letters(word): 
    lets = (c for c in reversed(word) if c.isalpha()) 
    return ''.join([c if not c.isalpha() else next(lets) 
        for c in word]) 

def reverse_sentence(sentence): 
    words = sentence.split() 
    return ' '.join([reverse_letters(word) for word in words]) 

versuchen, die mich

In [23]: reverse_sentence("to be or not to be, that is the question.") 
Out[23]: 'ot eb ro ton ot eb, taht si eht noitseuq.' 

In [24]: reverse_sentence("Don't try this at home!") 
Out[24]: "tno'D yrt siht ta emoh!" 
gibt
+0

Schön! (zumindest, wenn du gedeutet hast, was OP richtig will ...) –

3

Es ist möglich, eine Funktion als repl Argument re.sub() passieren, so können wir das verwenden Worte passen und umgekehrt sie:

import re 

def rev_each_word_in(sentence): 
    return re.sub(r'\b\S*\b', lambda m: m.group(0)[::-1], sentence) 

Das Muster \b\S*\b eine Wortgrenze übereinstimmt, gefolgt von einer beliebigen Anzahl von Nicht Leerzeichen, gefolgt von einer Wortgrenze.

Die Funktion (ein Lambda, der Kürze halber) dauert group(0) (der vollständige Text des Spiels) für jedes Spiel und kehrt es auf die übliche Weise um.

Beispiele:

>>> rev_each_word_in('to be or not to be that is the question.') 
'ot eb ro ton ot eb taht si eht noitseuq.' 

>>> rev_each_word_in("whether 'tis nobler in the mind to suffer") 
"rehtehw 'sit relbon ni eht dnim ot reffus" 

>>> rev_each_word_in("aye, there's the rub") 
"eya, s'ereht eht bur" 

Wie Sie sehen können, bewahrt dies die Position der Interpunktion unmittelbar vor oder nach Worten, während es in der Aufrechterhaltung " korrekte "Position innerhalb jedes umgekehrten Wortes.