ฉันมีรหัสต่อไปนี้:
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
ชื่อโดเมนไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก (นี่คือคะแนนสำหรับโซลูชัน regex)
rsplit()
ซ้ำวิธีการแก้ปัญหาไม่ได้มีพฤติกรรมเช่นเดียวกับendswith()
เมื่อสตริงเดิมไม่มีซับสตริงที่ท้าย แต่บางแห่งที่อยู่ตรงกลาง ตัวอย่างเช่น: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
แต่"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
มีข้อแม้: สำหรับn = 0
สิ่งนี้จะไม่ส่งคืนสตริงที่มีอักขระศูนย์สุดท้ายที่ถูกตัดออก แต่เป็นสตริงว่างแทน
หากคุณแน่ใจว่าสตริงปรากฏขึ้นในตอนท้ายวิธีที่ง่ายที่สุดคือใช้ 'replace':
url = 'abcdc.com'
print(url.replace('.com',''))
www.computerhope.com
กัน ตรวจสอบด้วยendswith()
และควรจะปรับ
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
return text[:-len(suffix)]
เนื่องจากดูเหมือนว่ายังไม่มีใครชี้เรื่องนี้ออกมา:
url = "www.example.com"
new_url = url[:url.rfind(".")]
สิ่งนี้ควรมีประสิทธิภาพมากกว่าวิธีที่ใช้split()
เนื่องจากไม่มีการสร้างรายการวัตถุใหม่และวิธีนี้ใช้ได้กับสตริงที่มีหลายจุด
ขึ้นอยู่กับสิ่งที่คุณรู้เกี่ยวกับ URL และสิ่งที่คุณต้องทำ หากคุณรู้ว่ามันจะลงท้ายด้วย '.com' (หรือ '.net' หรือ '.org') เสมอ
url=url[:-4]
เป็นทางออกที่เร็วที่สุด หากเป็น URL ทั่วไปมากขึ้นคุณน่าจะเข้าไปดูไลบรารี่ urlparse ที่มาพร้อมกับไพ ธ อนได้ดีกว่า
หากคุณต้องการลบทุกอย่างหลังจากสุดท้าย '.' ในสตริงแล้ว
url.rsplit('.',1)[0]
จะทำงาน. หรือถ้าคุณต้องการแค่ทุกอย่างจนถึงแรก '.' จากนั้นลอง
url.split('.',1)[0]
ถ้าคุณรู้ว่ามันเป็นส่วนเสริม
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
วิธีนี้ใช้ได้ดีกับabcdc.com
หรือwww.abcdc.com
หรือabcdc.[anything]
และสามารถขยายได้มากขึ้น
ในหนึ่งบรรทัด:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
แล้วไงurl[:-4]
ล่ะ
สำหรับ 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'
หากคุณจำเป็นต้องตัดปลายบางส่วนของสตริงถ้ามันมีอยู่อย่างอื่นทำอะไร ทางออกที่ดีที่สุดของฉัน คุณอาจต้องการใช้หนึ่งในสองการใช้งานครั้งแรก แต่ฉันได้รวม 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'
สำหรับ regex:
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"
สำหรับคอลเลกชันของคำต่อท้ายคงที่วิธีที่เร็วที่สุด asymptotically สำหรับการโทรจำนวนมาก:
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 ตัวแปร regex น่าจะเร็วกว่านี้สำหรับแทบทุกกรณีที่ไม่เกี่ยวข้องกับพจนานุกรมขนาดใหญ่ของคำต่อท้ายที่อาจเกิดขึ้นซึ่งไม่สามารถแสดงได้อย่างง่ายดายเป็น regex อย่างน้อยใน cPython
ใน PyPy ตัวแปร regex เกือบจะช้ากว่าสำหรับการโทรจำนวนมากหรือสายยาวแม้ว่าโมดูลใหม่จะใช้เอนจิ้น regex ที่รวบรวม DFA เป็นส่วนใหญ่ของค่าใช้จ่ายส่วนใหญ่ของแลมบ์ดาจะถูกปรับให้เหมาะสมโดย JIT
ใน cPython อย่างไรก็ตามข้อเท็จจริงที่ว่าการรันโค้ด c ของคุณสำหรับ regex นั้นเทียบได้กับข้อดีของอัลกอรึทึมของรุ่นต่อท้ายในเกือบทุกกรณี
หากคุณต้องการดึงเฉพาะส่วนขยาย:
'.'.join('abcdc.com'.split('.')[:-1])
# 'abcdc'
มันทำงานร่วมกับส่วนขยายใด ๆ โดยมีจุดอื่น ๆ ที่อาจมีอยู่ในชื่อไฟล์ด้วย มันแยกสตริงเป็นรายการบนจุดและรวมโดยไม่มีองค์ประกอบสุดท้าย
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 เป็นคอขวดทำไมจึงต้องเขียนด้วย Python
เมื่อใดที่ซีพียูคอขวดอยู่แล้ว ในไดรเวอร์อาจจะ
ข้อดีของการใช้นิพจน์ทั่วไปคือการใช้รหัสซ้ำ จะทำอย่างไรถ้าคุณต้องการลบ '.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.
s คุณควรตรวจสอบพวกเขาอย่างชัดเจน:
if url.startswith("www."):
url = url.replace("www.","", 1)
1 in replace ใช้สำหรับ edgecases แปลก ๆ เช่น www.net.www.com
หาก URL ของคุณได้รับความวุ่นวายมากขึ้นกว่าที่ดูที่คำตอบ regex ผู้คนได้ตอบสนองด้วย
ฉันใช้ฟังก์ชันrstripในตัวเพื่อทำตามชอบ:
string = "test.com"
suffix = ".com"
newstring = string.rstrip(suffix)
print(newstring)
test
"test.ccom"
ดู
คุณสามารถใช้แบ่ง:
'abccomputer.com'.split('.com',1)[0]
# 'abccomputer'
a = 'www.computerbugs.com'
ผลลัพธ์นี้ด้วย'www
'
นี่เป็นการใช้งานที่สมบูรณ์แบบสำหรับนิพจน์ทั่วไป:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
Python> = 3.9:
'abcdc.com'.removesuffix('.com')
Python <3.9:
def remove_suffix(text, suffix):
if text.endswith(suffix):
text = text[:-len(suffix)]
return text
remove_suffix('abcdc.com', '.com')