ลบตัวแบ่งบรรทัดทั้งหมดออกจากสตริงข้อความยาว ๆ


128

โดยทั่วไปฉันขอให้ผู้ใช้ป้อนสตริงข้อความลงในคอนโซล แต่สตริงยาวมากและมีการแบ่งบรรทัดจำนวนมาก ฉันจะใช้สตริงของผู้ใช้และลบตัวแบ่งบรรทัดทั้งหมดเพื่อให้เป็นข้อความบรรทัดเดียวได้อย่างไร วิธีการรับสตริงของฉันนั้นง่ายมาก

string = raw_input("Please enter string: ")

มีวิธีอื่นที่ฉันควรดึงสตริงจากผู้ใช้หรือไม่? ฉันใช้ Python 2.7.4 บน Mac

ป.ล. เห็นได้ชัดว่าฉันเป็น noob ดังนั้นแม้ว่าวิธีการแก้ปัญหาจะไม่ได้มีประสิทธิภาพมากที่สุด แต่สิ่งที่ใช้ไวยากรณ์ที่เรียบง่ายที่สุดก็จะได้รับการชื่นชม



4
@NicYoung ว่าเหมือน แต่แตกต่างกัน stripลบช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดของสตริงไม่ใช่ภายในสตริง ...
Daren Thomas

คำตอบ:


215

คุณเข้าสู่การแบ่งบรรทัดด้วยวิธีraw_inputใด? แต่เมื่อคุณมีสตริงที่มีอักขระบางตัวอยู่ที่คุณต้องการกำจัดเพียงแค่replaceพวกเขา

>>> 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?'
>>>

ในตัวอย่างด้านบนฉันแทนที่ช่องว่างทั้งหมด สตริง'\n'แทนบรรทัดใหม่ และ\rแสดงถึงการคืนรถ (หากคุณใช้ windows คุณอาจได้รับสิ่งเหล่านี้และอีกหนึ่งวินาทีreplaceจะจัดการให้คุณ!)

พื้น:

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

ยังทราบว่ามันเป็นความคิดที่ดีที่จะเรียกตัวแปรของคุณเป็นเงานี้โมดูลstring stringชื่ออื่นที่ฉันควรหลีกเลี่ยง แต่บางครั้งก็ชอบใช้: file. ด้วยเหตุผลเดียวกัน.


ทำงานได้อย่างสมบูรณ์ขอโทษสำหรับคำถามโง่ ๆ ! วิธีแก้ปัญหาเริ่มต้นของฉันคือแสดงรายการสตริงและค้นหาอินสแตนซ์ทั้งหมดของ \ n แต่เนื่องจากรายการมีเพียง 1 อักขระต่อรายการรายการการค้นหาจึงส่งคืนเท็จเนื่องจากจะพบ \ หรือ n แต่ไม่พบทั้งสองรายการในรายการเดียวกัน การเข้า
Ian Zane

4
คำตอบนี้มีประโยชน์กับฉันมากเพราะมันกล่าวถึงการ\rกลับรถ ฉันพยายามลบทุกวิธี\nแล้วแต่ก็ยังจับ\rตัวละครไม่ได้
ดิน

1
ซึ่งมักจะได้ผลสำหรับฉัน - string.replace ('\ r \ n', '')) ไฟล์บันทึก / โปรแกรมแก้ไขข้อความส่วนใหญ่มักจะทำตามรูปแบบนี้สำหรับบรรทัดใหม่
Quest Monger

1
คุณชี้ไม่ได้ใช้ชื่อตัวแปรแต่สำหรับเหตุผลที่คล้ายกันคุณไม่ต้องการที่จะใช้ชื่อตัวแปรstring str
tscizzle

2
@information_interchange วิธีนี้ทำงานบนไฟล์ลินุกซ์ที่มีแต่ไม่\n \r\n
Noumenon


26

คุณสามารถแยกสตริงโดยไม่มีอาร์กิวเมนต์ตัวคั่นซึ่งจะถือว่าช่องว่างที่ติดต่อกันเป็นตัวคั่นเดียว (รวมถึงบรรทัดใหม่และแท็บ) จากนั้นเข้าร่วมโดยใช้ช่องว่าง:

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

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


ไอเดียดีมากเพราะทำให้แท็บเป็นปกติช่องว่างสองชั้นและอื่น ๆ +1
daitangio

15

อัปเดตตามXbelloความคิดเห็น:

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

อ่านเพิ่มเติมที่นี่


3
ฉันโดนกัดแค่นี้ หากคุณระบุ \ n เป็น rstrip, \ r จะล้มเหลว หากคุณไม่ได้ระบุอะไรเลยช่องว่างและส่วนอื่น ๆ อาจถูกตัดออก คุณต้องใช้rstrip("\r\n")
xbello

1
มีสายอักขระที่rstrip('\r\n')ไม่เพียงพอและต้องไปด้วย:my_string.rstrip('\r\n').replace('\n', ' ')
MMT

8

อีกทางเลือกหนึ่งคือ regex:

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

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีจับคู่การแบ่งบรรทัดต่อเนื่องกันจะดีr'[\n\r]+'หรือแม้กระทั่งr'\s+'แทนที่ช่องว่างใด ๆ ด้วยช่องว่างเดียว
Risadinha

3

วิธีการพิจารณา

  • อักขระสีขาวเพิ่มเติมที่จุดเริ่มต้น / จุดสิ้นสุดของสตริง
  • อักขระสีขาวเพิ่มเติมที่จุดเริ่มต้น / จุดสิ้นสุดของทุกบรรทัด
  • อักขระสิ้นสุดบรรทัดต่างๆ

มันใช้สตริงหลายบรรทัดซึ่งอาจจะยุ่งเช่น

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

และสร้างสตริงบรรทัดเดียวที่ดี

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

UPDATE: ในการแก้ไขอักขระบรรทัดใหม่หลายตัวที่สร้างช่องว่างซ้ำซ้อน:

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

สิ่งนี้ใช้ได้กับสิ่งต่อไปนี้ด้วย test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '


สิ่งนี้ไม่ได้จัดการกับกรณีของฟีดบรรทัดที่อยู่ติดกันตรงกลางสตริง ฟีดสองบรรทัดทำให้เกิดช่องว่างสองช่องที่ต่อเนื่องกันในเอาต์พุต ลอง "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen

2

หากใครตัดสินใจใช้replaceคุณควรลองr'\n'ใช้แทน'\n'

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

ทำไม? ฉันจำไม่ได้ว่าทำไมถึงเป็นความคิดที่ดี แต่เราจำเป็นต้องจัดทำเอกสาร
Martin Burch

1
ในกรณีของฉันฉันต้องทำสิ่งนี้: 1. รับโค้ด HTML จาก DB 2. รับข้อความที่ต้องการจาก HTML 3. ลบบรรทัดใหม่ทั้งหมดออกจากข้อความ 4. แทรกข้อความที่แก้ไขลงในเอกสารสเปรดชีตและมันทำงานไม่ถูกต้องเว้นแต่ฉัน ใช้แล้วr("raw string literal") น่าเสียดายที่ฉันไม่รู้ว่าทำไม)
Anar Salimkhanov

1

ปัญหาเกี่ยวกับ rstrip คือมันไม่ได้ผลในทุกกรณี (อย่างที่ฉันเคยเห็นมาไม่กี่คน) คุณสามารถใช้ - text = text.replace ("\ n", "") แทนได้ซึ่งจะเป็นการลบบรรทัดใหม่ทั้งหมด \ n ด้วยช่องว่าง

ขอบคุณล่วงหน้าสำหรับการโหวตของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.