2009-05-24 67 views
63

Tôi có một chuỗi. Làm cách nào để xóa tất cả văn bản sau một ký tự nhất định? (Trong trường hợp này ...)
Các văn bản sau sẽ ... thay đổi vì vậy tôi đó là lý do tại sao tôi muốn loại bỏ tất cả các ký tự sau một nhất định.Làm thế nào để loại bỏ tất cả các ký tự sau một ký tự cụ thể trong python?

+5

Nếu bạn không chắc chắn rằng nó có ý nghĩa, sau đó cập nhật câu hỏi của bạn để cung cấp các ví dụ cụ thể về những gì bạn muốn làm. –

Trả lời

118

chia trên phân cách của bạn cùng một lúc nhất, và lấy miếng đầu tiên :

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

Bạn không nói điều gì sẽ xảy ra nếu trình tách không có mặt. Cả hai giải pháp này và Alex sẽ trả về toàn bộ chuỗi trong trường hợp đó.

+0

Yêu cầu là "xóa tất cả văn bản sau" dấu phân cách chứ không phải "nhận" văn bản đó, vì vậy tôi nghĩ bạn muốn [0], không phải [-1], trong giải pháp tuyệt vời khác của bạn. –

+0

Làm việc một cách hoàn hảo cảm ơn, như tôi chắc chắn Ayman & Alex đã làm là tốt, vì vậy cảm ơn tất cả. – Solihull

+3

Sử dụng rsplit() nếu bạn cần chia cho một ký tự bắt đầu từ cuối chuỗi. – Samuel

7

Nếu không có một RE (mà tôi giả định là những gì bạn muốn):

def remafterellipsis(text): 
    where_ellipsis = text.find('...') 
    if where_ellipsis == -1: 
    return text 
    return text[:where_ellipsis + 3] 

hay, với một RE:

import re 

def remwithre(text, there=re.compile(re.escape('...')+'.*')): 
    return there.sub('', text) 
+0

Có thể muốn sử dụng sep = '...' như một kwarg và sử dụng len (sep) thay vì mã hóa cứng 3 để làm cho nó hơi tương lai hơn bằng chứng. – cdleary

+0

Đúng, nhưng sau đó bạn cần phải biên dịch lại RE trên mỗi cuộc gọi, do đó hiệu suất sẽ chịu cho giải pháp RE (không có sự khác biệt thực sự đối với giải pháp không RE). Một số tổng quát là miễn phí, một số không phải là ... ;-) –

+0

@Alex - Cảm ơn bạn đã thử nghiệm các giải pháp! –

54

Giả sử dấu phân cách của bạn là '...', nhưng nó có thể là bất kỳ chuỗi nào.

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

>>> print head 
some string 

Nếu không tìm thấy dấu tách, head sẽ chứa tất cả chuỗi gốc.

Chức năng phân vùng đã được thêm vào trong Python 2.5.

phân vùng (...) S.partition (tháng chín) -> (đầu, tháng chín, đuôi)

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. 
+0

Tuy nhiên, một giải pháp tuyệt vời khác - chúng ta vi phạm TOOOWTDI? -) Có thể đáng để chạy kiểm tra thời gian ... –

+8

.partition thắng - 0,756 usec mỗi vòng lặp, so với 1.13 cho .split (định dạng nhận xét không thực sự cho phép tôi hiển thị các bài kiểm tra chính xác, nhưng tôi đang sử dụng văn bản và dấu tách @ Ayman) - vì vậy, +1 cho @ Ayman's câu trả lời! –

+1

và btw, để hoàn thành, giải pháp dựa trên RE là 2,54 usec, tức là, chậm hơn so với @ Ayman hoặc @ Ned's. –

0

một cách dễ dàng bằng thủ tục re sẽ

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 
6

Nếu bạn muốn xóa mọi thứ sau lần xuất hiện cuối cùng của dấu tách trong chuỗi, tôi thấy điều này hoạt động tốt:

<separator>.join(string_to_split.split(<separator>)[:-1])

Ví dụ, nếu string_to_split là một con đường như root/location/child/too_far.exe và bạn chỉ muốn các đường dẫn thư mục, bạn có thể chia nhỏ bởi "/".join(string_to_split.split("/")[:-1]) và bạn sẽ nhận được root/location/child

+0

Ngoài ra, bạn có thể thay đổi -1 đó thành bất kỳ chỉ mục nào là sự xuất hiện mà tại đó bạn thả văn bản. – theannouncer

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