Pythonで特定の文字の後のすべての文字を削除するにはどうすればよいですか?


147

紐があります。特定の文字の後のすべてのテキストを削除するにはどうすればよいですか?(この場合...
後のテキストが...変わるので、特定の文字の後のすべての文字を削除したいのはこのためです。


6
意味があるかどうかわからない場合は、質問を更新して、やりたいことの具体的な例を提供してください。
S.Lott、2009年

回答:


259

最大で一度にセパレーターを分割し、最初のピースを取得します。

sep = '...'
rest = text.split(sep, 1)[0]

セパレータが存在しない場合はどうなるかについては言いませんでした。この場合も、Alexのソリューションも、文字列全体を返します。


リクエストはセパレーターの「後のすべてのテキストを削除する」ことであり、そのテキストを「取得する」ことではないため、他の優れたソリューションでは、[-1]ではなく[0]が必要だと思います。
Alex Martelli、

AymanとAlexも同様に行ったと私は確信しているので、完全に感謝しました。
ソリハル

5
文字列の末尾から始まる文字で分割する必要がある場合は、rsplit()を使用します。
サミュエル

rsplit()は、区切り文字が複数ある場合、実際には質問に答えます
Nate

93

セパレータは「...」であると想定しますが、任意の文字列を使用できます。

text = 'some string... this part will be removed.'
head, sep, tail = text.partition('...')

>>> print head
some string

セパレータが見つからない場合headは、元の文字列がすべて含まれます。

パーティション関数はPython 2.5で追加されました。

パーティション(...)S.パーティション(9月)->(ヘッド、9月、テール)

Searches for the separator sep in S, and returns the part before it,
the separator itself, and the part after it.  If the separator is not
found, returns S and two empty strings.

さらに別の優れたソリューション-TOOOWTDIに違反していますか?-)確認するために時間をかける価値があるかもしれません...
Alex Martelli、

9
.partition wins-ループあたり0.756 usec、.splitの1.13(コメントのフォーマットでは実際に正確なテストを表示できませんが、@ Aymanのテキストとセパレーターを使用しています)-したがって、@ Aymanの回答に+1 !
Alex Martelli、

1
ところで、完全を期すために、REベースのソリューションは2.54 usecです。つまり、@ Aymanや@Nedのどちらよりもかなり低速です。
Alex Martelli、

2.5の土地にいる場合、パーティションが勝ちます:) 2.4で立ち往生している私たちの吸盤では、分割の氷河の速度が比較的遅い状態で生活する必要があります。
グレッグリンド

例は本当に役に立ちます。
Ms. Sabbir Ahmed

18

文字列内で最後にセパレーターが出現した後のすべてを削除したい場合、これがうまくいくことがわかります。

<separator>.join(string_to_split.split(<separator>)[:-1])

たとえば、のstring_to_splitようなroot/location/child/too_far.exeパスで、フォルダパスのみが必要な場合 は、分割し"/".join(string_to_split.split("/")[:-1])て次のようになります。 root/location/child


1
さらに、その-1を任意のインデックスに変更して、テキストをドロップする場所にすることができます。
アナウンサー2015

10

REがない場合(これはあなたが望んでいるものだと思います):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

または、RE:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)

sep = '...'をkwargとして使用し、3をハードコーディングする代わりにlen(sep)を使用して、より将来性を高めたい場合があります。
cdleary 2009年

そうですが、その後、呼び出しごとにREを再コンパイルする必要があるため、REソリューションのパフォーマンスは低下します(非REソリューションの実際の違いはありません)。一部の一般性は無料ですが、一部は無料ではありません... ;-)
Alex Martelli、

@Alex-ソリューションをテストしていただきありがとうございます。
Ayman Hourieh、2009年

2

メソッドfindは、文字列内の文字位置を返します。次に、キャラクターからすべてのものを削除する場合は、次のようにします。

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

文字を残しておきたい場合は、文字位置に1を加えます。


1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

出力:「これはテストです」


説明してください
lone_coder

1

ファイルから:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)

0

reを使用する別の簡単な方法は

import re, clr

text = 'some string... this part will be removed.'

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1)

// text = some string
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.