파이썬에서 특정 문자 다음에 모든 문자를 제거하는 방법은 무엇입니까?


148

문자열이 있습니다. 특정 문자 다음에 모든 텍스트를 제거하려면 어떻게합니까? ( 이 경우... )
이후의 텍스트가 ...변경되므로 특정 문자 다음의 모든 문자를 제거하고 싶습니다.


6
확실하지 않은 경우 질문을 업데이트하여 수행하려는 작업의 특정 예를 제공하십시오.
S.Lott

답변:


259

분리기를 최대 한 번 분할하고 첫 번째 조각을 가져옵니다.

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

분리기가 없으면 어떻게해야하는지 말하지 않았습니다. 이 경우와 Alex의 솔루션은 모두이 경우 전체 문자열을 반환합니다.


요청은 해당 텍스트를 "얻는"것이 아니라 구분 기호를 "다음에 모든 텍스트를 제거"하는 것이므로 다른 방법으로는 [-1]이 아닌 [0]을 원한다고 생각합니다.
Alex Martelli

Ayman & Alex도 마찬가지였습니다. 감사합니다. 감사합니다.
Solihull

5
문자열 끝에서 시작하여 문자로 분할해야하는 경우 rsplit ()을 사용하십시오.
사무엘

rsplit () 실제로 구분 기호가 여러 번 나타나는 경우 질문에 대답합니다.
Nate

94

구분 기호가 '...'이라고 가정하지만 모든 문자열이 될 수 있습니다.

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

>>> print head
some string

구분 기호를 찾을 수 없으면 head원래 문자열이 모두 포함됩니다.

파티션 함수는 파이썬 2.5에서 추가되었습니다.

파티션 (...) S. 파티션 (sep)-> (헤드, sep, tail)

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을 위반하고는 -?) 어쩌면 가치의 timeit 실행은 ... 확인
알렉스 마르 텔리

9
.partition이 승리합니다-루프 당 0.756 usec, .split의 경우 1.13 대 (코멘트 형식은 실제로 정확한 테스트를 보여주지는 않지만 @Ayman의 텍스트와 구분 기호를 사용하고 있습니다)-따라서 @Ayman의 답변에 +1 !
Alex Martelli

1
그리고 btw, 완전성을 위해, RE 기반 솔루션은 2.54 usec, 즉 @Ayman 또는 @Ned보다 느리다.
Alex Martelli

당신이 2.5 땅에 있다면 파티션이 승리합니다.
Gregg Lind

예가 정말 도움이됩니다.
Md. 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을 임의의 색인으로 변경하여 텍스트를 놓을 수 있습니다.
아나운서

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

그러나 각 호출마다 RE를 다시 컴파일해야하므로 RE 솔루션의 성능이 저하됩니다 (RE가 아닌 솔루션의 경우 실제로 차이가 없음). 어떤 일반성은 자유롭고, 어떤 것은 그렇지 않다 ... ;-)
Alex Martelli

@Alex-솔루션을 테스트 해 주셔서 감사합니다!
Ayman Hourieh

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.