Pythonは文字列の最後の3文字を削除します


146

私はPythonの文字列から最後の3文字を削除しようとしています、これらの文字が何であるかわからないので使用できません rstripまた、空白を削除して大文字に変換する必要があります

例は次のとおりです。

foo = "Bs12 3ab"
foo.replace(" ", "").rstrip(foo[-3:]).upper()

これは機能し、私が欲しいものであるBS12を与えますが、最後の4番目と3番目の文字が同じである場合、両方foo = "BS11 1AA"を失います。'BS'

の例はfoo次のとおりです。

BS1 1AB
bs11ab
BS111ab

文字列は6文字または7文字で、最後の3文字を削除する必要があります(空白がないと仮定)

任意のヒント?

回答:


278

すべての空白を削除:

foo = ''.join(foo.split())

最後の3文字を削除:

foo = foo[:-3]

大文字に変換する:

foo = foo.upper()

そのすべてのコードを1行で:

foo = ''.join(foo.split())[:-3].upper()

9
文字に加えて空白文字が削除されるため、Unicode文字列で使用する場合''.join(foo.split())はに比べて優れていることに注意したいと思いfoo.replace(' ', '')ます(特に、改行しないスペースも削除されます)。それはおそらくはるかに高速であるため、たとえば、入力文字列がスペース文字が1つしかないASCIIでエンコードされていることがわかっている場合に使用できます(ここではPython 2の用語を使用しています)' 'replace()
Eric O Lebigot

90

ストリップは文字ベースであるため、期待どおりに動作しません。代わりにこれを行う必要があります:

foo = foo.replace(' ', '')[:-3].upper()

11
OPが要求したWHITESPACEは削除されません。空白文字のみが削除されます。
John Machin、

15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'

2
@Lidiaはい、ストリップは文字列の最初と最後から空白のみを削除します。
Eliezer Miron

たとえばfoo [3:] foo [:-3]のようにこれをチェーンすることはできないことに注意してください
製作者

9

rstripを少し誤解している可能性があります。これは文字列ではなく、指定した文字列内の文字を削除します。

このような:

>>> text = "xxxxcbaabc"
>>> text.rstrip("abc")
'xxxx'

したがって、代わりに、

text = text[:-3] 

(空白を何も置換しない場合)



3

私は正規表現を避けようとしますが、これはうまくいくようです:

string = re.sub("\s","",(string.lower()))[:-3]


1
string.lower()はstring.upper()である必要があります。私の間違い。
krs1 2009年

これは、空白をうまく処理する唯一のソリューションです
Erik Aronesty


1
  1. split
  2. slice
  3. concentrate

これは初心者に適したトレーニングであり、簡単に達成できます。

別の高度な方法は、次のような関数です。

def trim(s):
    return trim(s[slice])

そして、この質問では、最後の文字を削除したいだけなので、次のように書くことができます。

def trim(s):
    return s[ : -3] 

あなたはこれらの3つのキャラクターが何であるかを気にする必要があるので、負けたと思います。あなたはそれでも彼らが誰であるかに関わらず、最後の3つを取り除きたいです!

特定の文字を削除したい場合は、if判断をいくつか追加できます。

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])

0

操作を間違った順序で実行していませんか?あなたの要件はfoo[:-3].replace(" ", "").upper()


質問の次のポイント>>>(空白がないと仮定)
Noctis Skytower 2009年

0

それはあなたの空白の定義に依存するものです。私は通常、空白をスペース、タブ、改行、改行と呼びます。これが定義である場合は、正規表現を\ sとともに使用して、すべての空白文字を置き換えます。

import re

def myCleaner(foo):
    print 'dirty: ', foo
    foo = re.sub(r'\s', '', foo)
    foo = foo[:-3]
    foo = foo.upper()
    print 'clean:', foo
    print

myCleaner("BS1 1AB")
myCleaner("bs11ab")
myCleaner("BS111ab")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.