2009-06-24 45 views
241

Tôi đã đoạn mã sau:Làm cách nào để xóa chuỗi con khỏi phần cuối của chuỗi bằng Python?

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

tôi mong đợi: abcdc

tôi nhận: abcd

Bây giờ tôi làm

url.rsplit('.com', 1) 

Có cách nào tốt hơn?

+33

Vâng. str.strip không làm những gì bạn nghĩ. str.strip xóa bất kỳ ký tự nào được chỉ định từ đầu và cuối chuỗi. Vì vậy, "acbacda" .strip ("quảng cáo") cho 'cbac'; một lúc đầu và da ở cuối đã bị tước bỏ. Chúc mừng. – scvalex

+2

__strip__ tách các ký tự được đưa ra từ cả hai đầu của chuỗi, trong trường hợp của bạn, dải đó ".", "C", "o" và "m". – truppo

+1

Nó cũng sẽ xóa các ký tự đó khỏi đầu chuỗi. Nếu bạn chỉ muốn xóa từ cuối, hãy sử dụng rstrip() –

Trả lời

357

Bạn có thể làm điều này:

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

Hoặc sử dụng biểu thức thông thường:

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

Bạn đánh bại tôi với câu trả lời hay hơn ... +1 –

+0

Điều nào sẽ tốt hơn? re.sub ('\. Com $', '', url) url.rsplit ('. Com', 1) [0] Hoặc là cả hai cách khác nhau để giải quyết vấn đề .. – Ramya

+13

Tôi muốn bỏ phiếu cho phương pháp phi regex –

9

Làm thế nào về url[:-4]?

0

Đây là một sử dụng hoàn hảo cho biểu thức thông thường:

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

Bạn cũng nên thêm $ để đảm bảo rằng bạn khớp với tên máy chủ * kết thúc * trong" .com ". –

5

Nếu bạn biết đó là một phần mở rộng, sau đó

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

này hoạt động tốt như nhau với abcdc.com hoặc www.abcdc.com hoặc abcdc.[anything] và được mở rộng hơn.

+3

Bạn cần phải cẩn thận với điều này, bởi vì nếu url được cung cấp thay đổi thành "www.abcdc.com", url.split ('.') [0] chỉ là "www". – Neil

+0

Tôi không cảm thấy cần phải bao gồm bất kỳ loại kiểm tra lỗi nào trong đoạn mã này, nhưng đó là một điểm rất tuyệt vời-- đặc biệt là cho nhận xét của tôi về khả năng mở rộng. – JohnMetta

+9

Điều này có thể được sửa bằng 'url.rsplit ('.', 1) [0]'. – EOL

-1

Tôi không thấy bất cứ điều gì sai trái với cách bạn đang làm nó với rsplit, nó thực hiện chính xác những gì bạn muốn. Tất cả phụ thuộc vào cách bạn muốn giải pháp chung chung như thế nào. Bạn có luôn luôn muốn loại bỏ .com, hoặc đôi khi nó sẽ là .org? Nếu trường hợp đó xảy ra, hãy sử dụng một trong các giải pháp khác, nếu không, hãy liên kết với rsplit()

Lý do dải() không hoạt động theo cách bạn mong đợi là nó hoạt động trên từng ký tự riêng lẻ. Nó sẽ quét qua chuỗi của bạn và xóa tất cả các lần xuất hiện của các ký tự từ đầu VÀ phía trước. Vì vậy, nếu chuỗi của bạn bắt đầu bằng 'c', điều đó cũng sẽ biến mất. Bạn sẽ sử dụng rstrip để chỉ dải từ phía sau.

+0

'rsplit' không thực hiện chính xác những gì OP muốn. – winni2k

17

Phụ thuộc vào những gì bạn biết về url của mình và chính xác những gì bạn đang cố gắng làm. Nếu bạn biết rằng nó sẽ luôn kết thúc bằng '.com' (hoặc '.net' hoặc '.org') thì

url=url[:-4] 

là giải pháp nhanh nhất. Nếu đó là một URL tổng quát hơn thì có lẽ bạn nên xem thư viện urlparse đi kèm với python.

Nếu bạn mặt khác, bạn chỉ muốn xóa mọi thứ sau lần cuối cùng '.' trong một chuỗi rồi

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

sẽ hoạt động. Hoặc nếu bạn chỉ muốn tất cả mọi thứ đến đầu tiên '.'Sau đó thử

url.split('.',1)[0] 
32
def strip_end(text, suffix): 
    if not text.endswith(suffix): 
     return text 
    return text[:len(text)-len(suffix)] 
+1

Nếu bạn biết rằng hậu tố không trống (như khi nó là một hằng số) thì: return text [: - len (hậu tố)] – MarcH

+1

Cảm ơn. Dòng cuối cùng có thể được rút ngắn: 'return text [: - len (hậu tố)]' – Jabba

+1

@Jabba: Đáng buồn thay, điều đó sẽ không hoạt động cho các hậu tố trống rỗng, như fuenfundachtzig đã đề cập. – yairchu

49

Nếu bạn chắc chắn rằng chuỗi chỉ xuất hiện ở cuối, sau đó cách đơn giản nhất là nên sử dụng 'thay thế':

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

cũng sẽ thay thế url như 'www.computerhope.com'. làm một kiểm tra với 'endswith()' và sẽ ổn thôi. – ghostdog74

+54

'" www.computerhope.com ".endswith (". Com ")' là đúng, nó vẫn sẽ phá vỡ! –

9

Trong một dòng:

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)] 
0

Hoặc bạn có thể sử dụng phân chia:

a = 'abccomputer.com' 
res = a.split('.com',1)[0] 
+4

Khi 'a = 'www.computerbugs.com'' kết quả này với'' www' ' – yairchu

+2

sử dụng' rsplit' .... –

6

Đối với các url (vì nó có vẻ là một phần của chủ đề bằng cách ví dụ đưa ra), người ta có thể làm điều gì đó như thế này:

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) 

Cả hai ý đầu ra: ('http://www.stackoverflow', '.com')

này cũng có thể được kết hợp với str.endswith(suffix) nếu bạn chỉ cần tách ".com" hoặc bất kỳ điều gì cụ thể.

0
def remove_file_type(infile): 
import re 
return(re.sub('\.[^.]*$','',infile)) 
remove_file_type('abc.efg')'abc' 
+0

Không chỉ đặt mã làm câu trả lời. Giải thích một cái gì đó liên quan đến nó. Vui lòng đọc http://stackoverflow.com/help/how-to-answer –

+0

Xin chào và chào mừng bạn đến với tràn ngăn xếp. như Orion đã chỉ ra - điều này cũng có thể giải quyết được vấn đề ... nhưng nó sẽ tốt nếu bạn có thể cung cấp một giải thích nhỏ về cách thức và lý do nó hoạt động :) Có rất nhiều người mới trên Stack overflow, và họ có thể học một điều hoặc hai từ chuyên môn của bạn - điều hiển nhiên đối với bạn có thể không phải như vậy đối với họ. –

26

Kể từ khi nó có vẻ như không ai đã chỉ này trên được nêu ra:

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

này nên hiệu quả hơn so với phương pháp sử dụng split() như không có đối tượng danh sách mới được tạo ra, và giải pháp này làm việc cho chuỗi với một vài dấu chấm.

+0

Wow, đó là một mẹo hay. Tôi không thể có được điều này để thất bại nhưng tôi cũng đã có một thời gian khó khăn để có thể suy nghĩ theo cách này có thể thất bại. Tôi thích nó nhưng nó rất "huyền diệu", khó có thể biết được điều này bằng cách nhìn vào nó. Tôi đã phải xử lý tinh thần mỗi phần của dòng để "làm cho nó". – DevPlayer

+5

Điều này không thành công nếu chuỗi tìm kiếm không có mặt và thay vào đó nó sẽ xóa nhầm ký tự cuối cùng. – robbat2

0

Trong trường hợp của tôi, tôi cần thiết để nâng cao một ngoại lệ vì vậy tôi đã làm:

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
import re 

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

Tôi muốn lặp lại câu trả lời này là cách biểu cảm nhất để làm điều đó. Tất nhiên, những điều sau đây sẽ mất ít thời gian CPU hơn

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

Tuy nhiên, nếu CPU là cổ chai tại sao viết bằng Python?

Khi nào CPU vẫn là cổ chai? trong trình điều khiển, có thể.

Ưu điểm của việc sử dụng cụm từ thông dụng là khả năng sử dụng lại mã. Điều gì sẽ xảy ra nếu bạn tiếp tục muốn xóa '.me', chỉ có ba ký tự?

Cùng một mã sẽ thực hiện thủ thuật.

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

url.rsplit ('com', 1)

là không hoàn toàn đúng.

gì bạn thực sự sẽ cần phải viết là

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

, và có vẻ IMHO khá gọn gàng.

Tuy nhiên, sở thích cá nhân của tôi là tùy chọn này vì nó chỉ sử dụng một tham số:

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

Nếu bạn có nghĩa là dải chỉ mở rộng

url = 'abcdc.com' 
print('.'.join(url.split('.')[:-1])) 

Nó hoạt động với bất kỳ phần mở rộng, với các chấm khác tiềm năng cũng tồn tại trong tên tệp. Nó chỉ đơn giản là tách chuỗi thành danh sách trên các dấu chấm và tham gia nó mà không có phần tử cuối cùng.

Có lẽ không phải là nhanh nhất, nhưng đối với tôi, nó dễ đọc hơn các phương pháp khác.

Các vấn đề liên quan