2010-09-07 20 views
34

Ich habe eine Reihe von StringsPython: Entfernen Sie nur am Ende der Zeichenfolge substring

einige von ihnen ' rec'

habe ich entfernen möchten, dass nur dann, wenn diejenigen, die letzten 4 Zeichen

so andere Wörter

somestring='this is some string rec' 

ich will es sein:

somestring='this is some string' 

was ist der Python-Weg, um das zu erreichen?

+0

möglich Duplikat [Python entfernen letzten 3 Zeichen einer Zeichenfolge] (http://stackoverflow.com/questions/1798465/python-remove-last-3-characters-of- a-string) – outis

+0

mögliches Duplikat von [Wie entferne ich eine Teilzeichenfolge am Ende einer Zeichenfolge in Python?] (http://stackoverflow.com/questions/1038824/how-do-i-remove-a-substring-) von der Ende-einer-Zeichenfolge-in-Python) –

Antwort

48
def rchop(thestring, ending): 
    if thestring.endswith(ending): 
    return thestring[:-len(ending)] 
    return thestring 

somestring = rchop(somestring, ' rec') 
+3

gute Sachen; Achten Sie nur auf das Shadowing der eingebauten 'str' – bernie

+0

Notiert und bearbeitet. Vielen Dank. –

+4

@Jack, 'string' ist der Name eines Standard-Bibliotheksmoduls, das auch eine schlechte Idee für nameclash sein kann, nicht weniger als eine eingebaute ...! -) Ich würde Ihnen eher empfehlen, sich an die Verwendung von Identifikatoren zu gewöhnen wie "thestring", "astring" und dergleichen statt! -). –

4

Sie einen regulären Ausdruck als auch nutzen könnten:

from re import sub 

str = r"this is some string rec" 
regex = r"(.*)\srec$" 
print sub(regex, r"\1", str) 
+8

Capturing-Gruppen sind hier zu viel. 'sub ('rec $', '', str)' funktioniert. –

19

Da Sie len(trailing) irgendwie erhalten haben (wo trailing ist die Zeichenfolge, die Sie entfernen möchten, wenn es Hinter), würde ich empfehlen, zu vermeiden die leichte Vervielfältigung von Arbeiten, die in diesem Fall .endswith verursachen würden. Natürlich ist der Beweis für den Code in das Timing ist, so lassen Sie uns einige Mess tun (die Funktionen zu benennen, nachdem die Befragten sie vorschlägt):

import re 

astring = 'this is some string rec' 
trailing = ' rec' 

def andrew(astring=astring, trailing=trailing): 
    regex = r'(.*)%s$' % re.escape(trailing) 
    return re.sub(regex, r'\1', astring) 

def jack0(astring=astring, trailing=trailing): 
    if astring.endswith(trailing): 
     return astring[:-len(trailing)] 
    return astring 

def jack1(astring=astring, trailing=trailing): 
    regex = r'%s$' % re.escape(trailing) 
    return re.sub(regex, '', astring) 

def alex(astring=astring, trailing=trailing): 
    thelen = len(trailing) 
    if astring[-thelen:] == trailing: 
     return astring[:-thelen] 
    return astring 

Sagen wir diese Python-Datei mit dem Namen haben a.py und es ist in der Aktuelles Verzeichnis; jetzt, ...:

$ python2.6 -mtimeit -s'import a' 'a.andrew()' 
100000 loops, best of 3: 19 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.jack0()' 
1000000 loops, best of 3: 0.564 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.jack1()' 
100000 loops, best of 3: 9.83 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.alex()' 
1000000 loops, best of 3: 0.479 usec per loop 

Wie Sie sehen, die RE-basierte Lösungen sind „hoffnungslos deklassiert“ (wie es oft geschieht, wenn ein „Overkills“ ein Problem - möglicherweise einer der Gründe, REs haben so eine schlechte Rep in der Python-Community! -), obwohl der Vorschlag in @ Jacks Kommentar viel besser ist als @ Andrews Original. Die String-basierten Lösungen, wie erwartet, shing, mit meinem endswith -Vermeiden, dass man einen winzigen Vorteil gegenüber @ Jack's (nur 15% schneller). Also, beide Pure-String-Ideen sind gut (und beide sind prägnant und klar) - ich bevorzuge meine Variante ein bisschen nur, weil ich, Charakter, ein sparsamer bin (manche sagen, geizig ;-) Person .. . "verschwenden Sie nicht, will nicht" -)

+0

Was haben Sie einen Platz im Import a '' a.xxx? – Blankman

+0

@Blankman, es ist ein Bash-Befehl mit Python: Das Setup ('-s') ist ein Argument, der Code wird zeitlich abgestimmt. Jeder wird zitiert, also muss ich mich nicht darum kümmern, einschließlich Leerzeichen und/oder Sonderzeichen, natürlich. Sie trennen Argumente immer mit Leerzeichen in bash (und den meisten anderen Shells, einschließlich der Windows-eigenen cmd.exe, so dass ich ziemlich überrascht bin) und zitieren Argumente zu einem Shell-Befehl, um Leerzeichen und Sonderzeichen in jedem Argument zu erhalten ist definitiv auch nicht das, was ich eine seltsame, seltene oder fortgeschrittene Verwendung irgendeiner Shell nennen würde ...! -) –

+0

Oh, ich sehe, du hast 'endswith' umgangen, wie ich in Jacks Antwort erwähnt habe. Caching der Len vermeidet auch Pythons (und C's!) Schrecklichen Anruf Overhead. –

1

als eine Art Motto Generator verbunden:

test = """somestring='this is some string rec' 
this is some string in the end word rec 
This has not the word.""" 
match = 'rec' 
print('\n'.join((line[:-len(match)] if line.endswith(match) else line) 
     for line in test.splitlines())) 
""" Output: 
somestring='this is some string rec' 
this is some string in the end word 
This has not the word. 
""" 
8

Wenn die Geschwindigkeit ist nicht wichtig, regex verwenden:

import re 

somestring='this is some string rec' 

somestring = re.sub(' rec$', '', somestring) 
0

more_itertools Verwendung, wir kann rstrip Zeichenfolgen, die ein Prädikat übergeben.

Installations

> pip install more_itertools 

-Code

import more_itertools as mit 


iterable = "this is some string rec".split() 
" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "})) 
# 'this is some string' 

" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "})) 
# 'this is some string' 

Hier passieren wir alle nachgestellten Artikel, die wir vom Ende abzustreifen möchten.

Siehe auch die more_itertools docs für Details.

Verwandte Themen