Câu hỏi Làm thế nào để loại bỏ tất cả các ký tự sau một ký tự cụ thể trong python?


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 ...)
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 số nhất định.


76
2018-05-24 21:56


gốc


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. - S.Lott


Các câu trả lời:


Tách trên dấu phân cách của bạn nhiều nhất một lần và lấy phần đầ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 dấu phân cá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 đó.


138
2018-05-24 22:01



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. - Alex Martelli
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ả các bạn. - Solihull
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
rsplit () thực sự trả lời câu hỏi nếu có nhiều lần xuất hiện của dấu phân tách - Nate


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.

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

vách ngăn(...)       S.partition (sep) -> (đầu, sep, đ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.

59
2018-05-24 22:02



Tuy nhiên, một giải pháp tuyệt vời - chúng tôi đang vi phạm TOOOWTDI? -) Có lẽ giá trị một thời gian chạy để kiểm tra ... - Alex Martelli
.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 câu trả lời của @ Ayman ! - Alex Martelli
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. - Alex Martelli
phân vùng thắng nếu bạn đang ở 2.5 đất :) Đối với chúng tôi suckers bị mắc kẹt trong 2.4, chúng ta phải sống với sự chậm chạp tương đối băng giá của chia. - Gregg Lind


Nếu không có 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]

hoặc, với RE:

import re

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

7
2018-05-24 22:00



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
Đú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, vì vậy hiệu suất bị cho các giải pháp RE (không có sự khác biệt thực sự cho các 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à ... ;-) - Alex Martelli
@ Alex - Cảm ơn bạn đã thử nghiệm các giải pháp! - Ayman Hourieh


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 phân 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 đường dẫn thư mục, bạn có thể chia "/".join(string_to_split.split("/")[:-1]) và bạn sẽ nhận được root/location/child


7
2017-09-14 22:18



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


một cách dễ dàng khác bằng cách sử dụng lại sẽ là

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

0
2018-05-20 10:42