파이썬에서 문자열 끝에서 부분 문자열을 어떻게 제거합니까?


382

다음 코드가 있습니다.

url = 'abcdc.com'
print(url.strip('.com'))

기대했다: abcdc

나는 얻었다 : abcd

지금은

url.rsplit('.com', 1)

더 좋은 방법이 있습니까?


6
strip 은 문자열의 양쪽 끝에서 주어진 문자를 제거합니다. 귀하의 경우에는 ".", "c", "o"및 "m"을 제거합니다.
truppo 2016 년

6
또한 문자열 앞면에서 해당 문자를 제거합니다. 끝에서 제거하려면 rstrip ()을 사용하십시오.
Andre Miller

42
네. str.strip은 당신이 생각하는 것을하지 않습니다. str.strip은 문자열의 시작과 끝에서 지정된 문자를 제거합니다. 따라서 "acbacda".strip ( "ad")는 'cbac'를 제공합니다. 처음에 a와 끝에 da가 제거되었습니다. 건배.
scvalex 2016 년

2
또한 "site.ocm"> "site" 와 같은 순서로 문자를 제거합니다 .
Eric O Lebigot

1
@scvalex, 와우, 방금이 방법을 오랫동안 사용했음을 깨달았습니다. 코드는 종종 어쨌든 작동하기 때문에 위험합니다.
Flash

답변:


556

strip"이 하위 문자열 제거"를 의미하지는 않습니다. 문자 집합으로 x.strip(y)취급 y하고의 끝에서 해당 문자 집합을 제거합니다 x.

대신 다음을 사용 endswith하고 슬라이싱 할 수 있습니다 .

url = 'abcdc.com'
if url.endswith('.com'):
    url = url[:-4]

또는 정규 표현식 사용 :

import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)

4
그래, 나 자신은 endswith () 테스트를 가진 첫 번째 예제가 더 좋을 것이라고 생각한다. 정규식은 성능 저하가 발생할 수 있습니다 (정규 구문 분석 등). 나는 rsplit () 하나를 사용하지 않을 것이지만, 당신이 정확히 달성하려는 것을 모르기 때문입니다. URL 끝에 나타나는 경우에만 .com을 제거한다고 생각합니까? rsplit 솔루션은 'www.commercialthingie.co.uk'와 같은 도메인 이름에 사용하면 문제가 발생합니다
Steef

13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
Burhan Khalid

1
EXAMLPLE.COM도메인 이름을 쓰면 대소 문자를 구분하지 않습니다. (이것은 정규식 솔루션에 대한 투표입니다)
Jasen

3
그것은 다시 쓰는 것이 아니며 rsplit()솔루션은 endswith()원래 문자열의 끝에 하위 문자열이 없지만 중간 어딘가에있을 때 와 동일한 동작을합니다 . 예를 들어 : "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"하지만"www.comeandsee.net".rsplit(".com",1)[0] == "www"
Steef

1
구문 s[:-n]에는주의 사항 n = 0이 있습니다.
BlenderBender

90

문자열이 끝에 만 나타나는 것이 확실한 경우 가장 간단한 방법은 '바꾸기'를 사용하는 것입니다.

url = 'abcdc.com'
print(url.replace('.com',''))

56
url 같은을 대체 www.computerhope.com합니다. 확인하고 endswith()잘해야합니다.
ghostdog74

72
"www.computerhope.com".endswith(".com")사실이지만 여전히 깨질 것입니다!

1
"문자열이 끝에 만 표시된다고 확신하는 경우"라는 의미는 "하위 문자열이 한 번만 나타나는 경우"라는 의미입니까? 대체는 부분 문자열이 중간에있을 때도 작동하는 것처럼 보이지만 다른 의견은 부분 문자열의 발생을 대체 할 것이라고 제안합니다. 왜 그것이 결국 이해가
안되는지

49
def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]

4
접미사가 비어 있지 않다는 것을 알고 있다면 (상수 일 때와 같이) return text [:
-len

4
감사. 마지막 줄은 짧아 질 수 있습니다 :return text[:-len(suffix)]
Jabba

3
@Jabba : 슬프게도 fuenfundachtzig가 언급했듯이 빈 접미사에서는 작동하지 않습니다.
yairchu

46

아무도 이것을 지적하지 않은 것처럼 보이기 때문에 :

url = "www.example.com"
new_url = url[:url.rfind(".")]

이것은 split()새로운리스트 객체가 생성되지 않을 때 사용하는 방법보다 효율적이어야하며 ,이 솔루션은 여러 개의 점이있는 문자열에서 작동합니다.


와우 좋은 트릭입니다. 나는 이것을 실패시킬 수 없었지만 이것이 실패 할 수있는 방법을 생각할 수 없었습니다. 나는 그것을 좋아하지만 그것은 매우 "마 법적"이며, 그것을 보는 것만으로 이것이 무엇을하는지 알기가 어렵습니다. 나는 그것을 얻기 위해 정신적으로 각 부분을 처리해야했다.
DevPlayer

14
검색된 문자열이 없으면 마지막 문자를 잘못 제거하여 실패합니다.
robbat2

25

URL에 대해 알고있는 것과 정확히 무엇을 시도하는지에 따라 다릅니다. 항상 '.com'(또는 '.net'또는 '.org')으로 끝나는 것을 알고 있다면

 url=url[:-4]

가장 빠른 솔루션입니다. 좀 더 일반적인 URL이라면 파이썬과 함께 제공되는 urlparse 라이브러리를 살펴 보는 것이 좋습니다.

반면에 마지막 '.'이후에 모든 것을 제거하고 싶을뿐입니다. 문자열로

url.rsplit('.',1)[0]

작동합니다. 또는 첫 번째 '.'까지 모든 것을 원한다면 다음 시도

url.split('.',1)[0]

16

그것이 확장이라는 것을 알고 있다면

url = 'abcdc.com'
...
url.rsplit('.', 1)[0]  # split at '.', starting from the right, maximum 1 split

이것은와 동일하게 작동 abcdc.com하거나 www.abcdc.com또는 abcdc.[anything]더 확장이다.




7

주어진 예제에서 주제의 일부인 것처럼 보이는 URL의 경우 다음과 같이 할 수 있습니다.

import os
url = 'http://www.stackoverflow.com'
name,ext = os.path.splitext(url)
print (name, ext)

#Or:
ext = '.'+url.split('.')[-1]
name = url[:-len(ext)]
print (name, ext)

둘 다 출력합니다 : ('http://www.stackoverflow', '.com')

str.endswith(suffix)".com"또는 특정 항목 만 분리해야하는 경우이 기능 과 결합 할 수도 있습니다 .


5

url.rsplit ( '. com', 1)

옳지 않습니다.

실제로 작성해야 할 것은

url.rsplit('.com', 1)[0]

그리고 그것은 간결한 IMHO처럼 보입니다.

그러나 개인 선호도는 하나의 매개 변수 만 사용하기 때문에이 옵션입니다.

url.rpartition('.com')[0]

1
항상 하나의 분할이 필요한 경우 +1 파티션이 선호됩니다. 항상 응답을 반환하므로 IndexError가 발생하지 않습니다.
Gringo Suave


2

문자열의 끝을 제거 해야하는 경우 아무것도하지 마십시오. 내 최고의 솔루션. 아마도 처음 2 구현 중 하나를 사용하고 싶을 수도 있지만 3을 포함 시켰습니다.

일정한 접미사 :

def remove_suffix(v, s):
    return v[:-len(s) if v.endswith(s) else v
remove_suffix("abc.com", ".com") == 'abc'
remove_suffix("abc", ".com") == 'abc'

정규식의 경우 :

def remove_suffix_compile(suffix_pattern):
    r = re.compile(f"(.*?)({suffix_pattern})?$")
    return lambda v: r.match(v)[1]
remove_domain = remove_suffix_compile(r"\.[a-zA-Z0-9]{3,}")
remove_domain("abc.com") == "abc"
remove_domain("sub.abc.net") == "sub.abc"
remove_domain("abc.") == "abc."
remove_domain("abc") == "abc"

상수 접미사 모음의 경우 많은 호출에 대해 가장 빠른 방법입니다.

def remove_suffix_preprocess(*suffixes):
    suffixes = set(suffixes)
    try:
        suffixes.remove('')
    except KeyError:
        pass

    def helper(suffixes, pos):
        if len(suffixes) == 1:
            suf = suffixes[0]
            l = -len(suf)
            ls = slice(0, l)
            return lambda v: v[ls] if v.endswith(suf) else v
        si = iter(suffixes)
        ml = len(next(si))
        exact = False
        for suf in si:
            l = len(suf)
            if -l == pos:
                exact = True
            else:
                ml = min(len(suf), ml)
        ml = -ml
        suffix_dict = {}
        for suf in suffixes:
            sub = suf[ml:pos]
            if sub in suffix_dict:
                suffix_dict[sub].append(suf)
            else:
                suffix_dict[sub] = [suf]
        if exact:
            del suffix_dict['']
            for key in suffix_dict:
                suffix_dict[key] = helper([s[:pos] for s in suffix_dict[key]], None)
            return lambda v: suffix_dict.get(v[ml:pos], lambda v: v)(v[:pos])
        else:
            for key in suffix_dict:
                suffix_dict[key] = helper(suffix_dict[key], ml)
            return lambda v: suffix_dict.get(v[ml:pos], lambda v: v)(v)
    return helper(tuple(suffixes), None)
domain_remove = remove_suffix_preprocess(".com", ".net", ".edu", ".uk", '.tv', '.co.uk', '.org.uk')

마지막은 아마도 pypy보다 cpython보다 훨씬 빠릅니다. 정규식 변형은 적어도 cPython에서 정규식으로 쉽게 표현할 수없는 잠재적 접미사의 거대한 사전을 포함하지 않는 거의 모든 경우에 대해 이보다 훨씬 빠릅니다.

PyPy에서 remod 모듈이 DFA 컴파일 정규식 엔진을 사용하더라도 람다의 오버 헤드 대부분이 JIT에 의해 최적화되기 때문에 정규식 변형은 많은 수의 호출이나 긴 문자열에 대해 거의 확실히 느립니다.

그러나 cPython에서 정규 표현식에 대해 실행중인 c 코드는 거의 모든 경우에 접미사 컬렉션 버전의 알고리즘 이점을 거의 확실히 비교합니다.


2

확장 기능 만 제거하려는 경우 :

'.'.join('abcdc.com'.split('.')[:-1])
# 'abcdc'

파일 이름에 다른 잠재적 인 점이있는 모든 확장과 함께 작동합니다. 단순히 문자열을 점의 목록으로 나누고 마지막 요소없이 조인합니다.


2
import re

def rm_suffix(url = 'abcdc.com', suffix='\.com'):
    return(re.sub(suffix+'$', '', url))

이 답변을 가장 표현하는 방법으로 반복하고 싶습니다. 물론 다음은 CPU 시간이 덜 걸립니다.

def rm_dotcom(url = 'abcdc.com'):
    return(url[:-4] if url.endswith('.com') else url)

그러나 CPU가 병목이라면 왜 파이썬으로 작성합니까?

어쨌든 CPU는 병목입니까? 아마 운전사에서.

정규식 사용의 장점은 코드 재사용 성입니다. 다음에 세 글자 만있는 '.me'를 제거하려면 어떻게해야합니까?

동일한 코드가 트릭을 수행합니다.

>>> rm_sub('abcdc.me','.me')
'abcdc'

1

제 경우에는 예외를 제기해야했습니다.

class UnableToStripEnd(Exception):
    """A Exception type to indicate that the suffix cannot be removed from the text."""

    @staticmethod
    def get_exception(text, suffix):
        return UnableToStripEnd("Could not find suffix ({0}) on text: {1}."
                                .format(suffix, text))


def strip_end(text, suffix):
    """Removes the end of a string. Otherwise fails."""
    if not text.endswith(suffix):
        raise UnableToStripEnd.get_exception(text, suffix)
    return text[:len(text)-len(suffix)]


1

도메인이 무엇이든 (.com, .net 등) 도메인을 제거한다고 가정합니다. .그 시점부터 모든 것을 찾아서 제거하는 것이 좋습니다 .

url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]

여기서는 이름으로 줄여야하는 rfindURL의 문제를 해결하는 데 사용 하고 abcdc.com.net있습니다 abcdc.com.

에 관심이 있다면 www.명시 적으로 확인해야합니다.

if url.startswith("www."):
   url = url.replace("www.","", 1)

대체의 1은 다음과 같은 이상한 가장자리입니다. www.net.www.com

URL이 그보다 더 강해지면 사람들이 응답 한 정규식 답변을보십시오.


1

내장 rstrip 함수를 사용하여 다음과 같이했습니다.

string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test

나쁜 생각. 시도하십시오 "test.ccom".
Shital Shah

그러나 이것이 문제의 핵심은 아닙니다. 다른 서브 스트링의 끝에서 알려진 서브 스트링을 제거하라는 요청을 받았습니다. 이것은 정확히 예상대로 작동합니다.
Alex

1

split을 사용할 수 있습니다 :

'abccomputer.com'.split('.com',1)[0]
# 'abccomputer'

5
a = 'www.computerbugs.com'이 결과를 'www'
yairchu

0

이것은 정규 표현식에 완벽하게 사용됩니다.

>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'

5
".com"으로 끝나는 호스트 이름과 일치하는지 확인하려면 $를 추가해야합니다 .
Cristian Ciupitu

0

파이썬> = 3.9 :

'abcdc.com'.removesuffix('.com')

파이썬 <3.9 :

def remove_suffix(text, suffix):
    if text.endswith(suffix):
        text = text[:-len(suffix)]
    return text

remove_suffix('abcdc.com', '.com')

1
Python 3.9에 대한 귀하의 답변은 위의 답변과 중복 됩니다. 이전 버전에 대한 귀하의 답변은이 스레드에서 여러 번 답변되었으며 문자열에 접미사가없는 경우 아무것도 반환하지 않습니다.
Xavier Guihot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.