다음 코드가 있습니다.
url = 'abcdc.com'
print(url.strip('.com'))
기대했다: abcdc
나는 얻었다 : abcd
지금은
url.rsplit('.com', 1)
더 좋은 방법이 있습니까?
다음 코드가 있습니다.
url = 'abcdc.com'
print(url.strip('.com'))
기대했다: abcdc
나는 얻었다 : abcd
지금은
url.rsplit('.com', 1)
더 좋은 방법이 있습니까?
답변:
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)
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
도메인 이름을 쓰면 대소 문자를 구분하지 않습니다. (이것은 정규식 솔루션에 대한 투표입니다)
rsplit()
솔루션은 endswith()
원래 문자열의 끝에 하위 문자열이 없지만 중간 어딘가에있을 때 와 동일한 동작을합니다 . 예를 들어 : "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
하지만"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
에는주의 사항 n = 0
이 있습니다.
문자열이 끝에 만 나타나는 것이 확실한 경우 가장 간단한 방법은 '바꾸기'를 사용하는 것입니다.
url = 'abcdc.com'
print(url.replace('.com',''))
www.computerhope.com
합니다. 확인하고 endswith()
잘해야합니다.
아무도 이것을 지적하지 않은 것처럼 보이기 때문에 :
url = "www.example.com"
new_url = url[:url.rfind(".")]
이것은 split()
새로운리스트 객체가 생성되지 않을 때 사용하는 방법보다 효율적이어야하며 ,이 솔루션은 여러 개의 점이있는 문자열에서 작동합니다.
주어진 예제에서 주제의 일부인 것처럼 보이는 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"또는 특정 항목 만 분리해야하는 경우이 기능 과 결합 할 수도 있습니다 .
url.rsplit ( '. com', 1)
옳지 않습니다.
실제로 작성해야 할 것은
url.rsplit('.com', 1)[0]
그리고 그것은 간결한 IMHO처럼 보입니다.
그러나 개인 선호도는 하나의 매개 변수 만 사용하기 때문에이 옵션입니다.
url.rpartition('.com')[0]
에서 시작 Python 3.9
하여 removesuffix
대신 사용할 수 있습니다 .
'abcdc.com'.removesuffix('.com')
# 'abcdc'
문자열의 끝을 제거 해야하는 경우 아무것도하지 마십시오. 내 최고의 솔루션. 아마도 처음 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 코드는 거의 모든 경우에 접미사 컬렉션 버전의 알고리즘 이점을 거의 확실히 비교합니다.
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'
제 경우에는 예외를 제기해야했습니다.
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)]
가장 간단한 코드가 있습니다.
url=url.split(".")[0]
도메인이 무엇이든 (.com, .net 등) 도메인을 제거한다고 가정합니다. .
그 시점부터 모든 것을 찾아서 제거하는 것이 좋습니다 .
url = 'abcdc.com'
dot_index = url.rfind('.')
url = url[:dot_index]
여기서는 이름으로 줄여야하는 rfind
URL의 문제를 해결하는 데 사용 하고 abcdc.com.net
있습니다 abcdc.com
.
에 관심이 있다면 www.
명시 적으로 확인해야합니다.
if url.startswith("www."):
url = url.replace("www.","", 1)
대체의 1은 다음과 같은 이상한 가장자리입니다. www.net.www.com
URL이 그보다 더 강해지면 사람들이 응답 한 정규식 답변을보십시오.
내장 rstrip 함수를 사용하여 다음과 같이했습니다.
string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test
"test.ccom"
.
이것은 정규 표현식에 완벽하게 사용됩니다.
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
파이썬> = 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')