আমি কীভাবে একটি চলন্ত নিউলাইন সরিয়ে ফেলতে পারি?


1686

পার্লের chompফাংশনের পাইথন সমতুল্য কী , যা কোনও স্ট্রিংয়ের শেষ চরিত্রটি যদি নতুন লাইন হয় তবে এটি সরিয়ে দেয়?


2
সুপারসেট: শুধু সম্পর্কে newline পরিবর্তে কোন স্ট্রিং: stackoverflow.com/questions/1038824/...
সিরো Santilli冠状病毒审查六四事件法轮功

3
এ + উত্তরটি হ'ল এটি যদি আপনার প্ল্যাটফর্মের জন্য open()উপযুক্ত 'নিউলাইন = ...' পরামিতি (সর্বজনীন নিউলাইন সমর্থন) সহ কোনও ফাইল ভুলে যাওয়ার কারণে হয়ে থাকে তবে আপনার সম্ভবত এটি পরিষ্কারভাবে অপসারণের প্রয়োজন হবে না।
স্মি

উত্তর:


1867

পদ্ধতিটি ব্যবহার করে দেখুন rstrip()(ডক পাইথন 2 এবং পাইথন 3 দেখুন )

>>> 'test string\n'.rstrip()
'test string'

পাইথনের rstrip()পদ্ধতিটি পার্লের মতো কেবল একটি নিউলাইনই নয়, ডিফল্টরূপে সমস্ত ধরণের ট্রাইলিং হোয়াইটস্পেসকে আলাদা করে দেয় chomp

>>> 'test string \n \r\n\n\r \n\n'.rstrip()
'test string'

শুধুমাত্র নতুনলাইনগুলি ছাঁটাই করতে:

>>> 'test string \n \r\n\n\r \n\n'.rstrip('\n')
'test string \n \r\n\n\r '

এছাড়াও পদ্ধতি lstrip()এবং strip():

>>> s = "   \n\r\n  \n  abc   def \n\r\n  \n  "
>>> s.strip()
'abc   def'
>>> s.lstrip()
'abc   def \n\r\n  \n  '
>>> s.rstrip()
'   \n\r\n  \n  abc   def'

22
আমি পাইথন ব্যক্তি নই সুতরাং এর উত্তর আমার কাছে নেই, তবে পার্লের চম্প () আসলে ইনপুট রেকর্ড বিভাজকটিকে শেষ থেকে সরিয়ে দেয়। এটি ইউনিক্স জিনিসগুলিতে একটি নতুন লাইন, তবে ভিন্ন হতে পারে (যেমন উইন্ডোজ) এবং এটি পরিবর্তনীয়। স্ট্রিংয়ের শেষে একবারে সেই মানটি সরিয়ে দেওয়ার কোনও উপায় আছে কি?
brian d foy

5
ব্রায়ান ডি ফয়ে: পাইথনের অ্যাজক এবং পার্লের মতো ইনপুট রেকর্ডার বিভাজক নেই।
পিটার হোসি

7
@ সিএসডি_রেটস, এটি সত্য নয়: ওএস এক্স \nইউনিক্সের মতো নতুন লাইনের জন্য ব্যবহার করে । (ওএস এক্সের \rআগে
ম্যাকোস

21
@ ব্রায়ানডফয় পাইথনের ইউনিভার্সাল নিউলাইনগুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে (কেবল যখন পড়ার সময়, লেখার সময় নয়)। আপনি ফাইলটি "ইউ" বা "আরইউ" মোডে খুলুন এবং তারপরে উইন্ডোজ, লিনাক্স, ম্যাক যাই হোক না কেন, পাঠ্যটি আপনার পাইথন কোডে পৌঁছানোর সাথে সাথে, নতুন লাইনের কোনও স্টাইলকে "\ n" দিয়ে প্রতিস্থাপন করা হয়েছে। দেখুন: python.org/dev/peps/pep-0278
AlcubierreDrive

11
আমি এগিয়ে যাব এবং এটিকে বানান করতে যাচ্ছি কারণ আমি একজন নবুব এবং আমি কেন কাজ করছে না তা ভেবে কিছুটা সময় ব্যয় করেছি। .strip()স্ট্রিংটি পরিবর্তন করে না (সম্ভবত পরিবর্তনশীল স্ট্রিংগুলির সাথে কিছু করার আছে)। কমান্ড লাইনে না থাকলে আপনি চাইবেন"string = string.strip()"
স্ক্রিপ্ট কিটি

158

এবং আমি বলব নতুন লাইনের অক্ষরগুলি অনুসরণ না করেই লাইন পাওয়ার "পাইথোনিক" উপায়টি হ'ল স্প্লিটলাইন ()।

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']


146

প্রান্তের শেষ-পংক্তির অক্ষরগুলি (EOL) কেটে ফেলার সাধারণ উপায় হ'ল স্ট্রিং স্ট্রাস্ট্রিপ () পদ্ধতিটি কোনও অনুসরণযোগ্য removing r বা \ n মুছে ফেলতে। এখানে ম্যাক, উইন্ডোজ এবং ইউনিক্স ইওল অক্ষরের উদাহরণ রয়েছে।

>>> 'Mac EOL\r'.rstrip('\r\n')
'Mac EOL'
>>> 'Windows EOL\r\n'.rstrip('\r\n')
'Windows EOL'
>>> 'Unix EOL\n'.rstrip('\r\n')
'Unix EOL'

'Rip r \ n' কে স্ট্রাইপের প্যারামিটার হিসাবে ব্যবহার করার অর্থ এটি '\ r' বা '\ n' এর কোনও অনুগামী সমন্বয়টি সরিয়ে ফেলবে। এজন্য উপরের তিনটি ক্ষেত্রে এটি কাজ করে।

বিরল ক্ষেত্রে এই উপদ্রবটি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, আমাকে একবার একটি পাঠ্য ফাইল প্রসেস করতে হয়েছিল যাতে এইচএল 7 বার্তা রয়েছে। এইচএল 7 মানকটির EOL অক্ষর হিসাবে একটি '\ r' অনুসরণ করতে হবে। আমি যে উইন্ডোজ মেশিনে এই বার্তাটি ব্যবহার করেছিলাম তার নিজস্ব '\ r \ n' ইওল অক্ষর যুক্ত হয়েছিল। সুতরাং, প্রতিটি লাইনের শেষটি '\ r \ r \ n' এর মতো দেখায়। স্ট্রাইপ ('\ r \ n') ব্যবহার করে পুরো '\ r \ r \ n' কে সরিয়ে ফেলতে পারত যা আমি চাইতাম না। সেক্ষেত্রে আমি কেবল তার পরিবর্তে শেষ দুটি অক্ষর কেটে ফেলি।

নোট করুন যে পার্লের chompফাংশন থেকে ভিন্ন , এটি স্ট্রিংয়ের শেষে সমস্ত নির্দিষ্ট অক্ষরগুলি ছাঁটাই করবে, কেবল একটি নয়:

>>> "Hello\n\n\n".rstrip("\n")
"Hello"

7
নোট করুন যে আধুনিক ম্যাক ওএস এক্স অ্যাপ্লিকেশনগুলি \ n ব্যবহার করে। ম্যাক ওএসের জন্য মূলত লিখিত কেবল পুরানো কার্বন অ্যাপ্লিকেশনই ব্যবহার করে \ r।
পিটার হোসি

2
স্পষ্টতার জন্য ধন্যবাদ। অবশ্যই, স্ট্রাস্ট্রিপ ('\ r \ n') এখনও সেই ক্ষেত্রে কাজ করে।
মাইক

13
এছাড়াও os.linesepরয়েছে, যা বর্তমান ওএসের জন্য ইওল সিকোয়েন্স ধারণ করে।
এলি কলিন্স

এটি সেরা উত্তর: এটি কেবল নিউলাইনগুলি স্ট্রিপ করে এবং সর্বাধিক সাধারণ প্ল্যাটফর্মগুলির জন্য এটি সঠিকভাবে করে।
কেভিনার্পে

প্লাস +1 ব্যবহারের জন্য \nএবং\r
প্রযুক্তিগত

99

মনে রাখবেন যে স্ট্রাইপ পার্লের চম্প () এর মতো কাজ করে না কারণ এটি স্ট্রিংটি পরিবর্তন করে না। অর্থাৎ পার্লে:

$x="a\n";

chomp $x

$xসত্ত্বেও ফলাফল "a"

কিন্তু পাইথনে:

x="a\n"

x.rstrip()

মানে হবে এই যে মান xহয় এখনো "a\n" । এমনকি x=x.rstrip()সর্বদা একই ফলাফল দেয় না, কারণ এটি স্ট্রিংয়ের শেষে থেকে সমস্ত সাদা অংশকে সরিয়ে দেয়, কেবলমাত্র একটি নিউলাইনই না।


7
এছাড়াও, স্ট্রিপ () পুনরাবৃত্তিযুক্ত অক্ষরগুলি সরিয়ে দেয়, যেখানে চপ /
চম্প

50

আমি এরকম কিছু ব্যবহার করতে পারি:

import os
s = s.rstrip(os.linesep)

আমি মনে করি যে সমস্যাটি rstrip("\n")হ'ল আপনি সম্ভবত লাইন বিভাজকটি বহনযোগ্য is (কিছু পুরানো ব্যবস্থা ব্যবহারের জন্য গুজব রয়েছে "\r\n")। অন্য গোটাচাটি হ'ল rstripবারবার সাদা স্থান ছড়িয়ে দেবে। আশা করি os.linesepসঠিক চরিত্রগুলি থাকবে। উপরেরটি আমার জন্য কাজ করে।


12
আপনি যদি কোনও ওয়েব অ্যাপ্লিকেশনটিতে ব্যবহারকারী জমা দেওয়া সামগ্রী পরিষ্কার করার চেষ্টা করছেন তবে এটি কাজ করবে না। ব্যবহারকারীর সামগ্রীটি যে কোনও উত্স থেকে আসতে পারে এবং এতে কোনও নতুন লাইন চর থাকতে পারে।
এপিগুই

2
ভাল কথা, আপনি আপনার আধুনিক ওএসে 'বিদেশী' ফাইলগুলি (অ্যান্টিক্যুটেড সিস্টেমগুলি থেকে) প্রসেস করতে পারেন Good
চককট্রিল

1
এটাও মনে রাখবেন যে আপনি যদি টেক্সট মোডে কোনও ফাইল পড়ছেন তবে এটি কোনও উইন্ডোজ সিস্টেমে কাজ করবে না, কারণ পিছনের অক্ষরটি সর্বদা '\ n' তে রূপান্তরিত হবে।
ম্যাড পদার্থবিজ্ঞানী

@ ম্যাডফিসিসিস্ট আপনি ঠিক বলেছেন যে এটি এটিকে রূপান্তর করে, তবে এটি এখনও কাজ করে কারণ এটি সমান rstrip('\r\n')এবং যুক্তিতে থাকা কোনও অক্ষরকেই ছিনিয়ে নেবে rstrip()
dtauxe

41

আপনি ব্যবহার করতে পারেন line = line.rstrip('\n')। এটি স্ট্রিংয়ের শেষে থেকে সমস্ত নিউলাইনগুলি সরিয়ে ফেলবে, কেবল একটি নয়।


35
s = s.rstrip()

স্ট্রিংয়ের শেষে সমস্ত নিউলাইন সরিয়ে ফেলবে s। অ্যাসাইনমেন্টটি প্রয়োজনীয় কারণ rstripমূল স্ট্রিংটি পরিবর্তনের পরিবর্তে একটি নতুন স্ট্রিং দেয়।


33

এটি "\ n" লাইন টার্মিনেটরের জন্য পার্লের চম্প (অ্যারেগুলিতে বিয়োগ আচরণ) প্রতিলিপি করবে:

def chomp(x):
    if x.endswith("\r\n"): return x[:-2]
    if x.endswith("\n") or x.endswith("\r"): return x[:-1]
    return x

(দ্রষ্টব্য: এটি 'জায়গায়' স্ট্রিংটি সংশোধন করে না; এটি অতিরিক্ত ট্রেলিং হোয়াইটস্পেস স্ট্রিপ করে না; অ্যাকাউন্টে takes r \ n নেয়)


27
"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

অথবা আপনি সবসময়ই রেজিএক্সপিএস দিয়ে গিরি পেতে পারেন :)

আনন্দ কর!


এটি লাইন এন্ডিং সহ একটি পাঠ্য ফাইলটি দ্রুত টেক্সটের এক লাইনে পরিণত করার চেষ্টা করে আমার পক্ষে দুর্দান্ত কাজ করেছে। আমি একজন নবাগত, সুতরাং এটি করার আরও ভাল উপায় আছে কিনা তা নিশ্চিত নই, তবে এটি কার্যকর হয়েছে, ধন্যবাদ! (স্ট্রিপটি কেবল অভ্যন্তরীণভাবে নয়, কেবল শেষ থেকে কাজ করবে)
স্টিভ কোচ

2
কেন কেবল একটি প্রতিস্থাপনের বিবৃতি ব্যবহার করবেন না .replace('\n|\r', '')?
ডুরকনব

2
@ ডুরকনোবফস্নো থেকে অন্য কেউ এই ধারণাটি ব্যবহার করতে চাইলে, রেজেক্স মডিউলটি ব্যবহার করার জন্য এটি কেবলমাত্র একটি ছোট পরিবর্তন: import re re.sub('\n|\r', '', '\nx\n\r\n')==> 'x'
টেলর এডমিস্টন

উল্লিখিত @ টেলরএডমিস্টন হিসাবে এটি এবং রেজেক্স কৌশলটি সঠিক উত্তর হওয়া উচিত।
ভড়গব

@ ভরগাভ আমি এই মন্তব্যের উপর ভিত্তি করে এই প্রশ্নের উত্তর যুক্ত করেছি যেহেতু আপনি প্রস্তাবিত কিছু অন্যান্য সম্পর্কিত বিকল্প অনুসন্ধান করার সময়। আমি আরও স্পষ্ট করে দিয়েছিলাম যে কেন আমি মনে করি স্ট্রিং স্ট্রিপ-এর চেয়ে রেজেেক্স এই সমস্যার একটি ভাল সমাধান যেহেতু সর্বাধিক উত্তরই ব্যবহার করে।
টেলর এডমিস্টন

27

আপনি স্ট্রিপ ব্যবহার করতে পারেন:

line = line.strip()

ডেমো:

>>> "\n\n hello world \n\n".strip()
'hello world'

1
এই সমাধানটি চেষ্টা করেও এটি লাইনের শীর্ষস্থানীয় ফাঁকা অংশগুলি সরিয়ে দেয়।
তারিক

@ তারিক আপনি স্ট্রিপটি ব্যবহার করতে পারেন
হ্যাকাহলিক

স্ট্র্যাপটি সমস্ত চক্রের সাদা স্থান মুছে ফেলবে, chomp এর বিপরীতে যা কেবলমাত্র একটি নতুনলাইনে মুছবে।
ফ্লিম

20

স্ট্রাস্ট্রিপ চম্পের মতো একই কাজ করে না, এতগুলি স্তরে। Http://perldoc.perl.org/funitions/chomp.html পড়ুন এবং দেখুন যে চম্পটি প্রকৃতপক্ষে খুব জটিল।

যাইহোক, আমার মূল কথাটি হ'ল chomp সর্বাধিক 1 লাইন সমাপ্তি সরিয়ে দেয়, অন্যদিকে স্ট্রিট্রিপ যতটা সম্ভব মুছে ফেলবে।

এখানে আপনি স্ট্রাস্ট্রিপটি সমস্ত নতুনলাইন অপসারণ করতে পারবেন:

>>> 'foo\n\n'.rstrip(os.linesep)
'foo'

সাধারণ পার্ল চম্প ব্যবহারের খুব কাছাকাছি সময়ে পুনরায় সাবের সাথে সম্পন্ন করা যেতে পারে, এর মতো:

>>> re.sub(os.linesep + r'\Z','','foo\n\n')
'foo\n'

2
কুডোস, আপনি কেবলমাত্র সেই ব্যক্তি যা এই অত্যন্ত গুরুত্বপূর্ণ বিশদটি নির্দেশ করেছেন। তবে, উপরের কেউ যেমন উল্লেখ করেছেন, আপনি অন্য সিস্টেম থেকে ফাইলগুলি পড়ছেন তবে os.linesep ব্যবহার করা কার্যকর হবে না। পাইথনটিতে এটি আরও কিছুটা সময় নিতে পারে, প্রকৃতপক্ষে লাইনের শেষটি পরীক্ষা করে।
ব্রায়ানমার্ন

19

যত্ন সহকারে "foo".rstrip(os.linesep): এটি কেবলমাত্র সেই প্ল্যাটফর্মের জন্যই নতুন লাইনের অক্ষরগুলিকে ছড়িয়ে দেবে যেখানে আপনার পাইথনটি কার্যকর করা হচ্ছে। কল্পনা করুন আপনি লিনাক্সের অধীনে উইন্ডোজ ফাইলের লাইনগুলিকে ঝিমঝিম করছেন:

$ python
Python 2.7.1 (r271:86832, Mar 18 2011, 09:09:48) 
[GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, sys
>>> sys.platform
'linux2'
>>> "foo\r\n".rstrip(os.linesep)
'foo\r'
>>>

"foo".rstrip("\r\n")পরিবর্তে মাইক যেমনটি বলেছে তেমন ব্যবহার করুন ।


অন্যটি লক্ষণীয় বিষয় হ'ল এটি সর্বাধিক একটি নতুন লাইন সরিয়ে দেয় না, তবে সমস্ত নতুন লাইনগুলি পৃথক করে chomp
ফ্লিম

19

পাইথনের ডকুমেন্টেশনের একটি উদাহরণ সহজভাবে ব্যবহার করে line.strip()

পার্লের chompফাংশনটি কেবল স্ট্রিংয়ের শেষে থেকে একটি লাইন ব্রেক ব্রেক ক্রম সরিয়ে দেয় যদি তা আসলে সেখানে থাকে।

পাইথনে আমি কীভাবে এটি করার পরিকল্পনা করছি, যদি processএই ফাইলটি থেকে প্রতিটি লাইনে কিছু কার্যকর করার জন্য আমার ধারণামূলক ক্রিয়াটি প্রয়োজন হয় তবে:

import os
sep_pos = -len(os.linesep)
with open("file.txt") as f:
    for line in f:
        if line[sep_pos:] == os.linesep:
            line = line[:sep_pos]
        process(line)

2
অবশেষে, এমন একটি উত্তর যা এটি একবারে সরিয়ে ফেলে (আসল চম্পের মতো ...) এবং এটি ওএস পোর্টেবল!
সিরো সান্তিলি 冠状 病毒 审查 六四 事件 法轮功

13

আমি পাইথনে প্রোগ্রাম করি না, তবে পাইথন.আর্গের একটি FAQ জুড়ে এসেছি পাইথন ২.২ বা তার পরে এসটারস্ট্রিপ ("\ r \ n") এর পক্ষে।


10
import re

r_unwanted = re.compile("[\n\t\r]")
r_unwanted.sub("", your_text)

2
এটি ট্যাব শ্বেতস্পেস সরিয়ে ফেলতে চলেছে, যা মূল প্রশ্নটির অনুরোধ করে না। (
Character

9

আমার কাছে এটি সুবিধাজনক মনে হয়েছে যে আপনি কোনও ফাইলের অবজেক্ট থেকে আন-চম্পড রেখাগুলি যেভাবে পেতে পারেন তার সমান্তরাল পুনরাবৃত্তাকারের মাধ্যমে চম্পড রেখাগুলি পেতে সক্ষম হবেন। আপনি নিম্নলিখিত কোড সহ এটি করতে পারেন:

def chomped_lines(it):
    return map(operator.methodcaller('rstrip', '\r\n'), it)

নমুনা ব্যবহার:

with open("file.txt") as infile:
    for line in chomped_lines(infile):
        process(line)

নোট: সঙ্গে operator.methodcallerএবং map( itertools.imapPy2 দিকে) আপনি সি স্তরে এই কাজ ধাক্কা পারেন, পাইথন স্তর জেনারেটরের কোড এড়ানো (এবং যার ফলে, একটু দ্রুত চলমান যদিও বোঝা যাচ্ছে যে নেতারা, I / O ওভারহেড সম্ভবত ছোট লাভ মাস্ক হয়): for line in map(operator.methodcaller('rstrip', '\r\n'), infile):। এটি এখনও হিসাবে চিহ্নিত করা যেতে পারে def chomped_lines(it): return map(operator.methodcaller('rstrip', '\r\n'), it)
শ্যাডোর্যাঞ্জার

8

বিশেষ ক্ষেত্রে কার্যকর সমাধান:

যদি নিউলাইন চরিত্রটি সর্বশেষ অক্ষর হয় (যেমন বেশিরভাগ ফাইলের ইনপুটগুলির ক্ষেত্রে হয়), তবে সংগ্রহের যে কোনও উপাদানগুলির জন্য আপনি নীচে সূচক করতে পারেন:

foobar= foobar[:-1]

আপনার নিউলাইন চরিত্রটি টুকরো টুকরো করতে।


3
কখনও কখনও নিউলাইনটি একটি শেষ চরিত্র নয়, তবে শেষেরগুলি বিশেষত উইন্ডোতে যেমন অন্যরা উল্লেখ করেছে।
কাকভস্কি

8

যদি আপনার প্রশ্নটি একাধিক লাইন স্ট্রিং অবজেক্টে (ওল্ডস্ট্রার) সমস্ত লাইন বিরতি পরিষ্কার করতে হয় তবে আপনি এটিকে ডিলিমিটার '\ n' অনুসারে একটি তালিকায় বিভক্ত করতে পারেন এবং তারপরে এই তালিকাকে একটি নতুন স্ট্র (newstr) এ যুক্ত করতে পারেন।

newstr = "".join(oldstr.split('\n'))


7

দেখে মনে হচ্ছে পারেলের চম্পের জন্য কোনও নিখুঁত অ্যানালগ নেই । বিশেষত, আর্ট্রিপ মাল্টি-ক্যারেক্টার নিউলাইন ডিলিমিটারগুলি পছন্দ করতে পারে না \r\n। যাহোক, splitlines নেই এখানে নির্দিষ্ট । ভিন্ন প্রশ্নের আমার উত্তর অনুসরণ করে, আপনি স্ট্রিং থেকে সমস্ত নতুনলাইন সরিয়ে / প্রতিস্থাপন করতে যোগদান এবং স্প্লিটলাইনগুলি একত্রিত করতে পারেন s:

''.join(s.splitlines())

নিম্নলিখিত অপসারণ হ'ল এক অনুসরণযোগ্য নিউলাইনটিকে (যেমন chomp হিসাবে আমি বিশ্বাস করি)। স্প্লিটলাইনগুলিতে যুক্তি Trueহিসাবে পাস keependsকরা সীমানা বজায় রাখে। তারপরে, স্রেফ "শেষ" রেখার সীমানা সরানোর জন্য আবার স্প্লিটলাইনগুলি কল করা হয়েছে:

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''

7

আমি অন্য জবাবের মন্তব্যে আগে পোস্ট করেছি এমন একটি থেকে আমার নিয়মিত অভিব্যক্তিভিত্তিক উত্তরটি বুবলী করছি। আমি মনে করি ব্যবহার reএকটা পরিষ্কার চেয়ে এই সমস্যার অনেক বেশী সুনিদৃষ্ট সমাধান str.rstrip

>>> import re

আপনি যদি এক বা একাধিক ট্রেলিং নিউলাইন চরগুলি অপসারণ করতে চান :

>>> re.sub(r'[\n\r]+$', '', '\nx\r\n')
'\nx'

আপনি যদি সর্বত্র নিউলাইন চরগুলি অপসারণ করতে চান (কেবল অনুসরণের নয়):

>>> re.sub(r'[\n\r]+', '', '\nx\r\n')
'x'

আপনি শুধুমাত্র 1-2 পিছিয়ে থাকা সম্পর্কে newline অক্ষর সরাতে চান তাহলে (অর্থাত, \r, \n, \r\n, \n\r, \r\r, \n\n)

>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r\n')
'\nx\r'
>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n\r')
'\nx\r'
>>> re.sub(r'[\n\r]{1,2}$', '', '\nx\r\n')
'\nx'

আমি একটা অনুভূতি যা বেশীর ভাগ মানুষ সত্যিই এখানে চাই, শুধু মুছে ফেলার জন্য আছে এক একটি trailing newline অক্ষর সংঘটন পারেন, \r\nঅথবা \nএবং কিছুই।

>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n\n', count=1)
'\nx\n'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n\r\n', count=1)
'\nx\r\n'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\r\n', count=1)
'\nx'
>>> re.sub(r'(?:\r\n|\n)$', '', '\nx\n', count=1)
'\nx'

(দ্য ?: হ'ল একটি নন-ক্যাপচারিং গ্রুপ তৈরি করা))

(যাই হোক এই হল না কি '...'.rstrip('\n', '').rstrip('\r', '')নেই যা এই থ্রেড উপর হুমড়ি। অন্যদের কাছে স্পষ্ট নাও হতে পারে str.rstripযতটা সম্ভব trailing অক্ষরের অনেক হিসাবে পটির, তাই মত একটি স্ট্রিং foo\n\n\nএর একটি মিথ্যা ইতিবাচক স্থাপিত হবে fooআপনি সংরক্ষণ করতে চেয়েছিলেন হতে পারে যেহেতু একটি নতুন ট্রেলিংয়ের পরে অন্য নতুন লাইনগুলি)


আপনি রেগেক্স সহ আপনার চূড়ান্ত পদ্ধতির জন্য এমনকি নন-ক্যাপচারিং গ্রুপটি এড়িয়ে যেতে পারেন r'\r?\n$'। সম্ভবত আরও দক্ষ, যেহেতু রেজেক্স ইঞ্জিনগুলির বিকল্পগুলি অনুকূলকরণের জন্য আরও কঠিন সময় রয়েছে। এছাড়াও মনে রাখবেন যে আপনি যদি এটি বেশ কয়েকবার করতে চলেছেন তবে তা একবারের সামনে প্রকাশের reজন্য উল্লেখযোগ্যভাবে দ্রুততর হবে (বিশেষত যদি আপনি অন্যান্য ব্যবহারের সাথে মিলিত হচ্ছেন), তবে সংকলিত রেজেক্স অবজেক্টের পদ্ধতিটি re.compileব্যবহার করুন sub; মডিউল ফাংশনগুলি পাইথন স্তরের এবং প্রথমে সংকলিত রেজিক্সগুলির জন্য ক্যাশে পরীক্ষা করুন (অনুপস্থিত থাকলে তৈরি / ক্যাশে করা), তারপরে ম্যাচিং পদ্ধতিটি কল করুন; এই লুকিং এড়িয়ে যাওয়া সাহায্য করে।
শ্যাডোএ্যাঞ্জার

1
এছাড়াও, পার্শ্ব-নোট: যেহেতু আপনি \nসরাসরি ম্যাচ করার চেষ্টা করছেন তাই আপনি \Zওভার ব্যবহার করতে চাইতে পারেন $(বা কেবল মেলাতে পারেন \r?$, কারণ $স্ট্রিংয়ের শেষে নিউলাইনের ঠিক আগেই স্পষ্টতই মিলতে পারে)।
শ্যাডোর্যাঞ্জার

5
>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'

আমার যে উদাহরণটি দরকার! সুতরাং স্ট্রিপ ("\ r \ n") রেখার শেষে যে কোনও সংমিশ্রণে '\ n' এবং '\ r' উভয়ই কেটে ফেলবে!
অ্যাগোস্টিনো

@ অগোস্টিনো সরবরাহ করার দরকার "\r\n"নেই উদাহরণস্বরূপ: ' spacious \n\r\n\r \n\n'.rstrip()উত্পাদন' spacious'
ওলিব্রে

2
@ অলিব্রে আপনার প্রস্তাবিত কোডটি অন্যান্য ফাঁকা / স্থান অক্ষরগুলিও ছাঁটাবে, এটির যা প্রয়োজন তা নাও হতে পারে। আসলে, আমার কেবল ইওল চরিত্রগুলির সংমিশ্রণগুলি সরিয়ে নেওয়া দরকার। তবুও, এটি দেখানোর জন্য ধন্যবাদ।
অ্যাগ্রোস্টিনো


4
s = '''Hello  World \t\n\r\tHi There'''
# import the module string   
import string
# use the method translate to convert 
s.translate({ord(c): None for c in string.whitespace}
>>'HelloWorldHiThere'

রেগেক্স সহ

s = '''  Hello  World 
\t\n\r\tHi '''
print(re.sub(r"\s+", "", s), sep='')  # \s matches all white spaces
>HelloWorldHi

Lace n, \ t, \ r প্রতিস্থাপন করুন

s.replace('\n', '').replace('\t','').replace('\r','')
>'  Hello  World Hi '

রেগেক্স সহ

s = '''Hello  World \t\n\r\tHi There'''
regex = re.compile(r'[\n\r\t]')
regex.sub("", s)
>'Hello  World Hi There'

যোগদানের সাথে

s = '''Hello  World \t\n\r\tHi There'''
' '.join(s.split())
>'Hello  World Hi There'

3

সেখানে লাইন শেষা w শ তিন ধরনের যে আমরা স্বাভাবিকভাবে সম্মুখীন আছেন: \n, \rএবং \r\n। একটি বরং সহজ রেগুলার এক্সপ্রেশন re.sub, যথাr"\r?\n?$" তাদের সমস্তকেই ধরতে সক্ষম।

(এবং আমরা তাদের সব ধরতে হবে , আমি ঠিক আছি?)

import re

re.sub(r"\r?\n?$", "", the_text, 1)

শেষ যুক্তি দিয়ে, আমরা কিছু পরিমাণে চম্পকে নকল করে, একটিকে প্রতিস্থাপিত সংখ্যার সীমাবদ্ধ করি। উদাহরণ:

import re

text_1 = "hellothere\n\n\n"
text_2 = "hellothere\n\n\r"
text_3 = "hellothere\n\n\r\n"

a = re.sub(r"\r?\n?$", "", text_1, 1)
b = re.sub(r"\r?\n?$", "", text_2, 1)
c = re.sub(r"\r?\n?$", "", text_3, 1)

... যেখানে a == b == cহয় True


এমনকি আপনার সম্পূর্ণ নিয়মিত প্রকাশের প্রয়োজন নেই। rstrip("\r\n")একটি ধরা সব। ব্যবহার করে দেখুন print(text_2.rstrip('\r\n'))
অ্যাগোস্টিনো

@ অ্যাগোস্টিনো: সত্য, str.rstrip()সমস্যা সমাধানের ফলে। এটি আপনার প্রয়োজনের উপর নির্ভর করে। এই সমাধানটি বিশেষত কেসগুলির জন্য তৈরি করা হয় যখন আপনাকে কেবল শেষটি সরিয়ে ফেলতে হবে "\n", "\r"বা "\r\n"সেগুলি সবগুলি না (যদি "\n"স্ট্রিংয়ে একাধিক থাকে)। re.sub(r"\r?\n?$", "", text_1, 1)রিটার্ন "hellothere\n\n"এবং text_1.rstrip("\r\n")রিটার্ন "hellothere"যা আলাদা স্ট্রিং।
internetional

আমি যা বলার চেষ্টা করছি তা হ'ল: এটি str.strip()একটি ক্যাচ অল যা কখনও কখনও খুব সমস্যা।
internetional

1

আপনি যদি গতি সম্পর্কে উদ্বিগ্ন হন (বলুন আপনার কাছে স্ট্রিংগুলির দীর্ঘতম তালিকা রয়েছে) এবং আপনি নিউলাইন চরটির প্রকৃতি জানেন তবে স্ট্রিং স্লাইসিং স্ট্রিং-এর চেয়ে বেশি দ্রুত is এটি উদাহরণস্বরূপ একটি সামান্য পরীক্ষা:

import time

loops = 50000000

def method1(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string[:-1]
    t1 = time.time()
    print('Method 1: ' + str(t1 - t0))

def method2(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string.rstrip()
    t1 = time.time()
    print('Method 2: ' + str(t1 - t0))

method1()
method2()

আউটপুট:

Method 1: 3.92700004578
Method 2: 6.73000001907

আমি জানি আমার সম্ভবত ফাংশনগুলির অভ্যন্তরে "গ্লোবাল লুপস" ব্যবহার করা উচিত, তবে এটি কাজ করে।
স্টিফেন মিলার

এই পরীক্ষাটি .. ভুল এবং ন্যায্য ইন method1আপনি শুধু শেষ অক্ষর, সেটা ব্যাপার কি, বন্ধ চপ করছে প্রথম চেক, যদি স্ট্রিংয়ের শেষ প্রান্ত অবাঞ্ছিত অক্ষর রয়েছে এবং তাদের বন্ধ চপ, শুধুমাত্র যদি কিছু পাওয়া যায় নি। দয়া করে অক্ষরগুলির জন্য কিছু পরীক্ষা করুন এবং পরীক্ষাগুলি প্রয়োগ করুন ! method2.rstrip()method1
চমত্কার

আমি উত্তরের ভূমিকাতে যেমন বলেছিলাম: আপনি যদি নতুন লাইনের চরটির প্রকৃতিটি জানেন তবে এটি কার্যকর। আপনি যদি হ্যাঁ না করেন তবে আপনাকে অবশ্যই কিছু ধরণের অক্ষর চেক প্রয়োগ করতে হবে - বা কেবল স্ট্রিপ ব্যবহার করা উচিত। আমি স্ট্রাইপটির প্রতি "অন্যায়" হওয়ার কথা বলতে চাইনি, তবে এটি এমন একটি তুচ্ছ তাত্পর্যপূর্ণ চিত্রিত করে যা কিছু পরিস্থিতিতে বিবেচনার জন্য উপযুক্ত হতে পারে।
স্টিফেন মিলার

1

এটি উইন্ডোজ এবং লিনাক্স উভয়ের জন্যই কাজ করবে (আপনি কেবল পুনরায় সমাধানের সন্ধান করছেন তবে রে সাব সহ কিছুটা ব্যয়বহুল)

import re 
if re.search("(\\r|)\\n$", line):
    line = re.sub("(\\r|)\\n$", "", line)


3
re.searchআপনার কেবল যেখানে প্রয়োজন সেখানে কেন ব্যবহার করবেন re.sub?
wjandrea

0

প্রথমে বিভক্ত লাইনগুলি তারপরে আপনার পছন্দ মতো কোনও বিভাজক দ্বারা যুক্ত করুন:

x = ' '.join(x.splitlines())

একটি কবজ মত কাজ করা উচিত।


-1

একটি ক্যাচ সব:

line = line.rstrip('\r|\n')

5
rstripনিয়মিত ভাব প্রকাশ করে না। "hi|||\n\n".rstrip("\r|\n")রিটার্ন"hi"
ফ্লিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.