Xóa tất cả các ngắt dòng khỏi một chuỗi văn bản dài


128

Về cơ bản, tôi đang yêu cầu người dùng nhập một chuỗi văn bản vào bảng điều khiển, nhưng chuỗi này rất dài và bao gồm nhiều ngắt dòng. Làm thế nào tôi có thể lấy chuỗi của người dùng và xóa tất cả các ngắt dòng để biến nó thành một dòng văn bản. Phương pháp của tôi để có được chuỗi rất đơn giản.

string = raw_input("Please enter string: ")

Có cách nào khác để tôi lấy chuỗi từ người dùng không? Tôi đang chạy Python 2.7.4 trên máy Mac.

PS Rõ ràng tôi là một người mới, vì vậy ngay cả khi một giải pháp không hiệu quả nhất, thì giải pháp sử dụng cú pháp đơn giản nhất sẽ được đánh giá cao.



4
@NicYoung, đó là tương tự nhưng khác nhau. stripxóa khoảng trắng ở đầu và cuối chuỗi, không nằm trong chuỗi ...
Daren Thomas

Câu trả lời:


214

Làm thế nào để bạn nhập ngắt dòng với raw_input? Nhưng, một khi bạn có một chuỗi có một số ký tự trong đó bạn muốn loại bỏ, chỉ cần replacechúng.

>>> mystr = raw_input('please enter string: ')
please enter string: hello world, how do i enter line breaks?
>>> # pressing enter didn't work...
...
>>> mystr
'hello world, how do i enter line breaks?'
>>> mystr.replace(' ', '')
'helloworld,howdoienterlinebreaks?'
>>>

Trong ví dụ trên, tôi đã thay thế tất cả các không gian. Chuỗi '\n'đại diện cho dòng mới. Và \rđại diện cho lợi nhuận vận chuyển (nếu bạn đang ở trên cửa sổ, bạn có thể nhận được những thứ này và một giây replacesẽ xử lý chúng cho bạn!).

về cơ bản:

# you probably want to use a space ' ' to replace `\n`
mystring = mystring.replace('\n', ' ').replace('\r', '')

Cũng lưu ý rằng, đó là một ý tưởng tồi để gọi biến của bạn string, vì điều này làm mờ mô-đun string. Một tên khác tôi muốn tránh nhưng đôi khi rất thích sử dụng : file. Cho cùng một lý do.


Làm việc hoàn hảo, xin lỗi cho câu hỏi ngu ngốc! Giải pháp ban đầu của tôi là liệt kê ra chuỗi và tìm tất cả các trường hợp của \ n, nhưng vì danh sách chỉ có 1 ký tự cho mỗi mục nhập danh sách, nên tìm kiếm tiếp tục trả về sai vì nó sẽ tìm thấy \ hoặc n nhưng không phải cả hai trong cùng một danh sách nhập cảnh.
Ian Zane

4
Câu trả lời này rất hữu ích với tôi vì nó đề cập đến việc \rvận chuyển trở lại. Tôi đã thử tất cả các phương pháp để loại bỏ \nnhưng vẫn không bắt được các \rký tự.
Clay

1
Điều này thường làm công việc cho tôi - string.replace ('\ r \ n', '')). Hầu hết các tệp nhật ký / trình soạn thảo văn bản có xu hướng theo định dạng này cho các dòng mới.
Quest Monger

1
Bạn chỉ ra không sử dụng tên biến string, nhưng vì một lý do tương tự, bạn không muốn sử dụng tên biến str.
tscizzle

2
@in information_interchange Cách tiếp cận này hoạt động trên các tệp Linux có \nnhưng không có \r\n.
Noumenon ngày

45

Bạn có thể thử sử dụng chuỗi thay thế:

string = string.replace('\r', '').replace('\n', '')

Tôi đã có một vấn đề với một số văn bản. Tôi đã thử sử dụng rstrip (), nhưng không hiệu quả. Tôi sử dụng thay thế ().
Bruno Gomes

25

Bạn có thể phân tách chuỗi không có phân tách arg, điều này sẽ coi khoảng trắng liên tiếp là một dấu tách duy nhất (bao gồm các dòng mới và các tab). Sau đó tham gia bằng cách sử dụng khoảng trắng:

In : " ".join("\n\nsome    text \r\n with multiple whitespace".split())
Out: 'some text with multiple whitespace'

https://docs.python.org/2/l Library / stdtypes.html # str.split


Ide

15

cập nhật dựa trên Xbellobình luận:

string = my_string.rstrip('\r\n')

đọc thêm ở đây


3
Tôi đã bị cắn bởi điều này. Nếu bạn chỉ định \ n cho rstrip, \ r sẽ thất bại. Nếu bạn không chỉ định gì, khoảng trắng, và có thể những thứ khác sẽ bị cắt bớt. Bạn phải sử dụngrstrip("\r\n")
xbello

1
có một chuỗi nơi rstrip('\r\n')không đủ và phải đi cùng:my_string.rstrip('\r\n').replace('\n', ' ')
MMT

8

Một lựa chọn khác là regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'

thông tin thêm về cách khớp các ngắt dòng liên tiếp sẽ tốt r'[\n\r]+'hoặc thậm chí r'\s+'thay thế bất kỳ khoảng trắng nào bằng một khoảng trắng.
Risadinha

3

Một phương pháp có tính đến

  • các ký tự trắng bổ sung ở đầu / cuối chuỗi
  • các ký tự trắng bổ sung ở đầu / cuối của mỗi dòng
  • nhân vật cuối dòng khác nhau

nó có một chuỗi nhiều dòng như vậy có thể lộn xộn, ví dụ

test_str = '\nhej ho \n aaa\r\n   a\n '

và tạo chuỗi một dòng đẹp

>>> ' '.join([line.strip() for line in test_str.strip().splitlines()])
'hej ho aaa a'

CẬP NHẬT: Để sửa nhiều ký tự dòng mới tạo khoảng trắng thừa:

' '.join([line.strip() for line in test_str.strip().splitlines() if line.strip()])

Điều này cũng làm việc cho sau đây test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


Điều này không xử lý trường hợp nguồn cấp dữ liệu liền kề ở giữa chuỗi. Hai nguồn cấp dữ liệu dẫn đến hai khoảng trống liền kề trong đầu ra. Hãy thử "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen

2

Nếu bất cứ ai quyết định sử dụng replace, bạn nên thử r'\n'thay thế'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')

Tại sao? Tôi mơ hồ nhớ tại sao đây là một ý tưởng tốt, nhưng chúng ta cần ghi lại nó.
Martin Burch

1
Trong trường hợp của tôi, tôi cần phải làm điều này: 1. Nhận mã HTML từ DB 2. Nhận văn bản cần thiết từ HTML 3. Xóa tất cả dòng mới khỏi văn bản 4. Chèn văn bản đã chỉnh sửa vào tài liệu bảng tính Và nó không hoạt động chính xác, trừ khi tôi được sử dụng r("chuỗi ký tự thô"). Thật không may, tôi không biết tại sao)
Anar Salimkhanov

1

Vấn đề với rstrip là nó không hoạt động trong mọi trường hợp (như bản thân tôi đã thấy rất ít). Thay vào đó, bạn có thể sử dụng - text = text.replace ("\ n", ""), điều này sẽ xóa tất cả dòng mới \ n bằng một khoảng trắng.

Cảm ơn những người đi trước cho upvotes của bạn.

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.