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


147

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 xóa tất cả các ký tự sau một ký tự nhất định.


6
Nếu bạn không chắc chắn rằng nó có ý nghĩa, thì hãy 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âu trả lời:


259

Tách trên dải phân cách của bạn nhiều nhất một lần và lấy mảnh đầ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ải phân cách không có mặt. Cả giải pháp này và Alex sẽ trả lại toàn bộ chuỗi trong trường hợp đó.


Yêu cầu là "xóa tất cả văn bản sau" dấu phân cách, không "lấy" văn bản đó, vì vậy tôi nghĩ rằng bạn muốn [0], chứ 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 hoàn hảo cảm ơn, vì tôi chắc chắn Ayman & Alex cũng đã làm như vậy, cảm ơn tất cả các bạn.
Solihull

5
Sử dụng rsplit () nếu bạn cần phân tách bằng 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 cách
Nate

93

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 phân cách, headsẽ chứa tất cả các chuỗi gốc.

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

phân vùng (...) 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.

Tuy nhiên, một giải pháp tuyệt vời - chúng ta vi phạm TOOOWTDI -?) Có lẽ đáng timeit chạy để kiểm tra ...
Alex Martelli

9
.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 phân cách của @ Ayman) - vì vậy, +1 cho câu trả lời của @ Ayman !
Alex Martelli

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

phân vùng chiến thắng nếu bạn ở 2,5 đất :) Đối với chúng tôi, những người hút bị mắc kẹt trong 2.4, chúng tôi phải sống với sự chậm chạp tương đối băng giá.
Gregg Lind

Ví dụ thực sự hữu ích.
Md. Sabbir Ahmed

18

Nếu bạn muốn xóa mọi thứ sau lần phân tách cuối cùng 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_splitlà một đường dẫn giống như root/location/child/too_far.exevà bạn chỉ muốn đường dẫn thư mục, bạn có thể tách ra "/".join(string_to_split.split("/")[:-1])và bạn sẽ nhận được root/location/child


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

10

Không có RE (mà tôi giả sử 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)

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ó trở nên dễ chứng minh hơn trong tương lai.
cdleary

Đúng, nhưng sau đó bạn cần biên dịch lại RE trên mỗi cuộc gọi, do đó hiệu năng bị ảnh hưởng bởi 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 phải RE). Một số tổng quát là miễn phí, một số không ... ;-)
Alex Martelli

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

2

Phương thức find sẽ trả về vị trí ký tự trong một chuỗi. Sau đó, nếu bạn muốn loại bỏ mọi thứ khỏi nhân vật, hãy làm điều này:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

Nếu bạn muốn giữ nhân vật, thêm 1 vào vị trí nhân vật.


1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Đầu ra: "Đây là một thử nghiệm"


vui lòng giải thích
lone_coder

1

Từ một tập tin:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)

0

một cách dễ dàng khác sử dụng re 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.