පසුපසින් සිටින නව රේඛාවක් ඉවත් කරන්නේ කෙසේද?


1703

පර්ල්ගේ chompශ්‍රිතයට සමාන පයිතන් යනු කුමක්ද? එය නව රේඛාවක් නම් නූලක අවසාන අක්‍ෂරය ඉවත් කරයි.


2
සුපර්සෙට්: නව රේඛාවක් වෙනුවට ඕනෑම නූලක්: stackoverflow.com/questions/1038824/…
සිරෝ සැන්ටිලි 郝海东 冠状 病 六四 法轮功 法轮功

3
A + පිළිතුර නම්, මෙය ඔබගේ වේදිකාව සඳහා open()සුදුසු 'newline = ...' පරාමිතිය සහිත ගොනුවකට අමතක වීම නිසා (විශ්වීය නව රේඛීය සහාය), ඔබට එය පැහැදිලිව ඉවත් කිරීමට අවශ්‍ය නොවනු ඇත.
smci

Answers:


1892

ක්‍රමය උත්සාහ කරන්න rstrip()(doc Python 2 සහ Python 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
brian d foy: පයිතන්ට awk සහ Perl වැනි ආදාන වාර්තා බෙදුම්කරුවෙකු නොමැත.
පීටර් හෝසි

7
@csde_rates, එය සත්‍ය නොවේ: OS X \nයුනික්ස් මෙන් නව රේඛා සඳහා භාවිතා කරයි . (OS X ට පෙර, MacOS \rරේඛීය බෙදුම්කරුවෙකු ලෙස භාවිතා කළ නමුත් එය වසර 10 කට පෙර අවසන් විය.)
skue

21
ri බ්‍රයන්ඩ්ෆෝයි පයිතන්ට යුනිවර්සල් නව රේඛා සඳහා සහය දක්වයි (කියවීමේදී මිස ලිවීමේදී නොවේ). ඔබ ගොනුව "U" හෝ "rU" ආකාරයෙන් විවෘත කර, පසුව වින්ඩෝස්, ලිනක්ස්, මැක් කුමක් වුවත්, පෙළ ඔබේ පයිතන් කේතයට ළඟා වන විට, ඕනෑම නව විලාසිතාවක් "\ n" සමඟ ප්‍රතිස්ථාපනය කර ඇත. බලන්න: python.org/dev/peps/pep-0278
AlcubierreDrive

12
මම ඉදිරියට ගොස් මෙය අක්ෂර වින්‍යාස කිරීමට යන්නේ මම නොබියව සිටින නිසා සහ එය ක්‍රියාත්මක නොවන්නේ මන්දැයි මම කල්පනා කළෙමි. .strip()නූල් වෙනස් නොකරයි (බොහෝ විට වෙනස් කළ නොහැකි නූල් සමඟ යමක් කළ හැකිය). විධාන රේඛාවේ නොමැති නම්, ඔබට අවශ්‍ය වනු ඇත"string = string.strip()"
ස්ක්‍රිප්ට් කිටී

159

අළුත් රේඛා අක්ෂර පසුපස නොගෙන රේඛා ලබා ගැනීම සඳහා “පයිතොනික්” ක්‍රමය බෙදීම් () යැයි මම කියමි.

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


147

එන්-පේළියේ (ඊඕඑල්) අක්ෂර ඉවත් කිරීමට කැනොනිකල් ක්‍රමය නම් r r හෝ ri n යන ඕනෑම ඉවත් කිරීමක් ඉවත් කිරීම සඳහා නූල් rstrip () ක්‍රමය භාවිතා කිරීමයි. මැක්, වින්ඩෝස් සහ යුනික්ස් ඊඕඑල් අක්ෂර සඳහා උදාහරණ මෙන්න.

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

Rstrip සඳහා පරාමිතිය ලෙස '\ r \ n' භාවිතා කිරීමෙන් අදහස් කරන්නේ එය '\ r' හෝ '\ n' හි ඕනෑම පසුපස සංයෝජනයක් ඉවත් කරනු ඇති බවයි. ඉහත අවස්ථා තුනෙහිම එය ක්‍රියාත්මක වන්නේ එබැවිනි.

මෙම සූක්ෂ්මතාවය දුර්ලභ අවස්ථාවන්හිදී වැදගත් වේ. උදාහරණයක් ලෙස, මට වරක් HL7 පණිවිඩයක් අඩංගු පෙළ ගොනුවක් සැකසීමට සිදු විය. එච්එල් 7 ප්‍රමිතියට එහි ඊඕඑල් අක්‍ෂරය ලෙස පසුපසින් '\ r' අවශ්‍ය වේ. මම මෙම පණිවිඩය භාවිතා කළ වින්ඩෝස් යන්ත්‍රය තමන්ගේම '\ r \ n' EOL අක්‍ෂරය එකතු කර ඇත. එබැවින්, එක් එක් පේළියේ අවසානය '\ r \ r \ n' ලෙස පෙනුනි. Rstrip ('\ r \ n') භාවිතා කිරීම මට අවශ්‍ය වූ මුළු '\ r \ r \ n' ඉවත් කිරීමට ඉඩ තිබුණි. එවැනි අවස්ථාවක, මම ඒ වෙනුවට අන්තිම අක්ෂර දෙක කපා දැමුවෙමි.

පර්ල්ගේ chompශ්‍රිතය මෙන් නොව , මෙය එක් අක්ෂරයකට පමණක් නොව, සියලු නිශ්චිත අකුරු ඉවත් කරනු ඇත.

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

7
නවීන මැක් ඕඑස් එක්ස් යෙදුම් use n භාවිතා කරන බව සලකන්න. මැක් ඕඑස් භාවිතය සඳහා මුලින් ලියා ඇති පැරණි කාබන් යෙදුම් පමණි \ r.
පීටර් හෝසි

2
පැහැදිලි කිරීම සඳහා ස්තූතියි. ඇත්ත වශයෙන්ම, rstrip ('\ r \ n') තවමත් එම අවස්ථාවේ දී ක්‍රියාත්මක වේ.
මයික්

13
ද තිබෙන os.linesepවත්මන් මෙහෙයුම් පද්ධතිය සඳහා EOL අනුක්රමය අඩංගු.
එලී කොලින්ස්

මෙය හොඳම පිළිතුරයි: එය නව රේඛා පමණක් ඉවත් කරන අතර වඩාත් පොදු වේදිකා සඳහා එය නිවැරදිව කරයි.
kevinarpe

plus +1 භාවිතා කිරීම සඳහා \nසහ\r
fechnert

99

Rstrip හරියටම පර්ල්ගේ chomp () මෙන් ක්‍රියා නොකරන බව සලකන්න. එනම්, පර්ල් හි:

$x="a\n";

chomp $x

ප්‍රති results ල $xවීම "a".

නමුත් පයිතන්හි:

x="a\n"

x.rstrip()

එහි වටිනාකම තවමත් පවතින බව එයින් අදහස් xවේ . පවා එය නූල්, වැඩිම එක් නව පේළියකට යොමු කිරීමේ අක්ෂරය නොව අවසානයේ සිට සියලු whitespace තීරු ලෙස සෑම විටම, එම ප්රතිඵලය දෙන්නේ නැහැ. "a\n"x=x.rstrip()


7
තවද, තීරු () නැවත නැවත අක්ෂර ඉවත් කරන අතර, චොප් / චොම්ප් ඉවත් කරන්නේ එක් නව
රේඛාවක්

50

මම මේ වගේ දෙයක් භාවිතා කළ හැකිය:

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

මම හිතන්නේ ගැටලුව rstrip("\n")වන්නේ රේඛා බෙදුම්කරු අතේ ගෙන යා හැකි බවට වග බලා ගැනීමට ඔබට අවශ්‍ය වනු ඇත. (සමහර පෞරාණික පද්ධති භාවිතා කිරීමට කටකතා පැතිර ඇත "\r\n"). අනෙක් ගොචා යනු rstripනැවත නැවතත් සුදු අවකාශය ඉවත් කිරීමයි. os.linesepනිවැරදි අක්ෂර අඩංගු වේ යැයි බලාපොරොත්තු වෙමු . ඉහත කරුණු මා වෙනුවෙන් වැඩ කරයි.


12
කෙසේ වෙතත් ඔබ වෙබ් යෙදුමක පරිශීලක ඉදිරිපත් කළ අන්තර්ගතය පිරිසිදු කිරීමට උත්සාහ කරන්නේ නම් මෙය ක්‍රියාත්මක නොවේ. පරිශීලක අන්තර්ගතය ඕනෑම ප්‍රභවයකින් පැමිණිය හැකි අතර ඕනෑම නව අක්ෂර ඇතුළත් විය හැකිය.
apiguy

2
හොඳ කරුණක් නම්, ඔබ ඔබේ නවීන ඕඑස් හි 'විදේශීය' ගොනු (පෞරාණික පද්ධති වලින්) සැකසීම හැර.
චක්කොට්රිල්

1
ඔබ ගොනුවක් පෙළ ප්‍රකාරයේදී කියවන්නේ නම්, මෙය වින්ඩෝස් පද්ධතියක ක්‍රියා නොකරනු ඇති බව මතක තබා ගන්න, මන්දයත් පසුපස අක්‍ෂරය සැමවිටම '\ n' බවට පරිවර්තනය වේ.
පිස්සු භෞතික විද්‍යා

@MadPhysicist ඔබ එය පරිවර්තනය කරන්නේ එම අයිතිය ඇත, නමුත් එය සමාන නිසා එය තවමත් ක්රියා rstrip('\r\n')හා rstrip()එම තර්කය සිටින බව ඕනෑම අක්ෂර අහිමි වනු ඇත.
dtauxe

41

ඔබට භාවිතා කළ හැකිය line = line.rstrip('\n'). මෙය එක් නවකථාවක් පමණක් නොව නූල් කෙළවරේ සිට ඉවත් කරයි.


35
s = s.rstrip()

නූල අවසානයේ සියලුම නව රේඛා ඉවත් sකරයි. පැවරුම අවශ්‍ය වන්නේ rstripමුල් නූල වෙනස් කිරීම වෙනුවට නව නූලක් ලබා දෙන බැවිනි .


34

මෙය "\ n" රේඛීය ටර්මිනේටරය සඳහා හරියටම පර්ල්ගේ චොම්ප් (අරා වල behavior ණ හැසිරීම) අනුකරණය කරයි:

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

(සටහන: එය 'ස්ථානයේ' නූල වෙනස් නොකරයි; එය පසුපසින් යන අමතර අවකාශය ඉවත් නොකරයි; \ r \ n සැලකිල්ලට ගනී)


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

හෝ ඔබට සැමවිටම රීජෙක්ස් සමඟ ගීකර් ලබා ගත හැකිය :)

විනෝද වන්න!


පේළි අවසානයක් සහිත පෙළ ගොනුවක් ඉක්මනින් එක් පේළියක් බවට පත් කිරීමට උත්සාහ කිරීම සඳහා මෙය මට බෙහෙවින් ඉවහල් විය. මම නවකයෙක්, එබැවින් එය කිරීමට වඩා හොඳ ක්‍රමයක් තිබේදැයි විශ්වාස නැත, නමුත් එය ක්‍රියාත්මක විය, ස්තූතියි! (තීරුව ක්‍රියාත්මක වන්නේ කෙළවරේ සිට මිස අභ්‍යන්තරයෙන් නොවේ)
ස්ටීව් කොච්

2
එක් ආදේශන ප්‍රකාශයක් පමණක් භාවිතා නොකරන්නේ ඇයි .replace('\n|\r', '')?
tckmn

2
වෙනත් කෙනෙකුට oDoorknobofSnow වෙතින් අදහස භාවිතා කිරීමට අවශ්‍ය නම්, එය රීජෙක්ස් මොඩියුලය භාවිතා කිරීම කුඩා වෙනසක් පමණි: import re re.sub('\n|\r', '', '\nx\n\r\n')==> 'x'.
ටේලර් එඩ්මිස්ටන්

AyTaylorEdmiston සඳහන් කළ පරිදි මෙය සහ රීජෙක්ස් තාක්ෂණය භාවිතා කිරීම නිසි පිළිතුර විය යුතුය.
භාර්ගව්

Har භාර්ගව් ඔබ යෝජනා කළ පරිදි මෙම අදහස මත පදනම්ව මම මෙම ප්‍රශ්නයට පිළිතුරක් එකතු කර ඇති අතර තවත් අදාළ විකල්ප කිහිපයක් ගවේෂණය කරමි. Strerrstrip ට වඩා රීජෙක්ස් මෙම ගැටලුවට වඩා හොඳ විසඳුමක් යැයි මා සිතන්නේ මන්දැයි මම පැහැදිලි කළෙමි.
ටේලර් එඩ්මිස්ටන්

27

ඔබට තීරුව භාවිතා කළ හැකිය:

line = line.strip()

නිරූපණය:

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

1
මෙම විසඳුම උත්සාහ කළ නමුත් එය ප්‍රමුඛ පෙළේ හිස් තැන් ඉවත් කරයි.
තාරික්

ArTarik ඔබට rstrip භාවිතා කළ හැකිය
Hackaholic

rstrip විසින් එක් නව රේඛාවක් පමණක් මකා දැමිය හැකි chomp මෙන් නොව, පසුපස ඇති සියලු හිස් අවකාශය මකා දමනු ඇත.
Flimm

20

rstrip බොහෝ මට්ටම් වල chomp ලෙසම කරන්නේ නැත. Http://perldoc.perl.org/functions/chomp.html කියවන්න ඇත්ත වශයෙන්ම චොම්ප් ඉතා සංකීර්ණ බව බලන්න.

කෙසේ වෙතත්, මගේ ප්‍රධාන කාරණය නම්, චොම්ප් උපරිම වශයෙන් පේළි 1 ක් ඉවත් කරන අතර rstrip මඟින් හැකි තරම් ප්‍රමාණයක් ඉවත් කරනු ඇත.

සියලු නව රේඛා ඉවත් කිරීම rstrip මෙහිදී ඔබට දැක ගත හැකිය:

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

සාමාන්‍ය පර්ල් චොම්ප් භාවිතය පිළිබඳ වඩාත් ආසන්න තක්සේරුවක් re.sub සමඟ සිදු කළ හැකිය, මේ ආකාරයට:

>>> 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.
Flimm

19

Python හි ප්රලේඛනය උදාහරණයක් හුදෙක් භාවිතා 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
අවසාන වශයෙන්, එය එක් වරක් පමණක් ඉවත් කරන පිළිතුරක් (නියම චොම්ප් වැනි ...) සහ OS අතේ ගෙන යා හැකි ය!
සිරෝ සැන්ටිලි 郝海东 冠状 病 六四 事件 法轮功


10
import re

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

2
මෙය ද මුල් ප්‍රශ්නය ඉල්ලා නොසිටින ටැබ් සුදු අවකාශය ඉවත් කිරීමට යන්නේ ය. (Character t චරිතය හේතුවෙන්)
NoahR

9

ඔබේ ප්‍රශ්නය නම්, සියලු රේඛා බිඳීම් බහු රේඛා str වස්තුවක (oldstr) පිරිසිදු කිරීම නම්, ඔබට එය '\ n' පරිසීමාවට අනුව ලැයිස්තුවකට බෙදිය හැකි අතර පසුව මෙම ලැයිස්තුවට නව str (newstr) ලෙස සම්බන්ධ කරන්න.

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


ස්තූතියි - එය මට හොඳට වැඩ කළා!
joe_evans

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)

සටහන: Py2 සමඟ operator.methodcallerසහ map( itertools.imapPy2 මත) ඔබට මෙම කාර්යය C ස්ථරයට තල්ලු කළ හැකිය, පයිතන් මට්ටමේ උත්පාදක කේතය මඟහරවා ගත හැකිය (එමඟින් තරමක් වේගයෙන් ධාවනය වේ, පිළිගත හැකි වුවත් 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
සමහර විට නව පේළියකට යොමු කිරීමේ අක්ෂරය නොවේ එය අවසන් අක්ෂරය, නමුත් පසුගිය අය, විශේෂයෙන් ජනේලය මත, අන් අය පෙන්වා ඇති පරිදි.
කැකොව්ස්කි

7

පර්ල්ගේ චොම්ප් සඳහා පරිපූර්ණ ඇනලොග් නොමැති බව පෙනේ . විශේෂයෙන්, rstrip වැනි බහු-අක්ෂර නව රේඛා පරිමිතීන් හැසිරවිය නොහැක \r\n. කෙසේ වෙතත්, මෙහි පෙන්වා ඇති පරිදි භේදය රේඛා කරයි . වෙනත් ප්‍රශ්නයකට මගේ පිළිතුර අනුගමනය කිරීමෙන් , ඔබට සියලු නව රේඛා නූලකින් ඉවත් කිරීමට / ප්‍රතිස්ථාපනය කිරීමට එක්වීම සහ බෙදීම් ඒකාබද්ධ කළ හැකිය :s

''.join(s.splitlines())

පහත සඳහන් කොටස් ඉවත් හරියටම එක් අගින් ඇද නව පේළියකට යොමු කිරීමේ අක්ෂරය (chomp ලෙස, මම විශ්වාස කරන්නේ). පසුකර Trueලෙස keependssplitlines කිරීමට තර්කය ක්රමයන්හි කිරීමේ බලය රඳවා ගෙන සිටී. අන්තිම "පේළියේ" පරිසීමක ඉවත් කිරීම සඳහා ස්ප්ලිට්ලයින් නැවත කැඳවනු ලැබේ:

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'

ඔබ අවර නව පේළියකට යොමු කිරීමේ අක්ෂරය chars 1-2 පමණක් ඉවත් කිරීමට අවශ්ය නම්, (එනම්, \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'

මෙහි බොහෝ දෙනෙකුට සැබවින්ම අවශ්‍ය වන්නේ කුමක්දැයි මට හැඟේ, පසුපසින් එන නව චරිතයක එක් සිදුවීමක් පමණක් ඉවත් කිරීම \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හැකි ලෙස අගින් ඇද චරිත බොහෝ ලෙස තීරු, ඒ නිසා වැනි වැලක් 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'

මට අවශ්‍ය ආදර්ශය! එබැවින් rstrip ("\ r \ n") රේඛාවේ අවසානයේ ඕනෑම සංයෝජනයකින් '\ n' සහ '\ r' යන දෙකම ඉවත් කරයි!
ඇගොස්ටිනෝ

GoAgostino සැපයීමට අවශ්‍ය නැත "\r\n"උදාහරණයක් ලෙස: ' spacious \n\r\n\r \n\n'.rstrip()නිෂ්පාදනය කරයි' spacious'
ඔලිබ්‍රේ

2
ඔබ යෝජනා කරන කේතය වෙනත් හිස් / අවකාශ අක්ෂර ඉවත් කරයි, එය කෙනෙකුට අවශ්‍ය නොවන විය හැකිය. ඇත්ත වශයෙන්ම, මට අවශ්‍ය වූයේ eol අක්ෂරවල සංයෝජන ඉවත් කිරීමට පමණි. තවමත්, මෙය පෙන්වා දීමට ස්තූතියි.
ඇගොස්ටිනෝ

4

භාවිතා කරන්න:

line = line.rstrip("\n")

හෝ

line = line.strip("\n")

ඔබට මෙම සංකීර්ණ දේවල් කිසිවක් අවශ්‍ය නොවේ


2
මෙය චොම්ප් වලට සමාන නොවන බව සලකන්න.
Flimm

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

ආදේශ කරන්න \ 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

අප සාමාන්යයෙන් මුහුණ එම රේඛාව අවසානය වර්ග තුනක් ඇත: \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')).
ඇගොස්ටිනෝ

G ඇගොස්ටිනෝ: ඇත්ත, str.rstrip()ගැටලුව විසඳන බව ඇත්ත . එය ඔබට ඇති අවශ්‍යතා මත රඳා පවතී. මෙම විසඳුම ඔබ පසුගිය ඉවත් කිරීමට අවශ්ය වන විට නඩු සඳහා විශේෂයෙන් සෑදී "\n", "\r"හෝ "\r\n"නමුත් සියලු ඔවුන් නැත (කිහිපයක් තිබේ නම් "\n"වැල මත). re.sub(r"\r?\n?$", "", text_1, 1)ප්‍රතිලාභ "hellothere\n\n"සහ text_1.rstrip("\r\n")ප්‍රතිලාභ "hellothere"වෙනස් නූලකි.
අන්තර්ජාල

මම කියන්නට උත්සාහ කරන්නේ: str.strip()එය අල්ලා ගැනීමකි - සියල්ල සමහර විට ඉතාම ගැටලුවයි.
අන්තර්ජාල

1

ඔබ වේගය ගැන සැලකිලිමත් වන්නේ නම් (ඔබට නූල් ලැයිස්තුවක් ඇති බව පවසන්න) සහ නව රේඛා වර්‍ගයේ ස්වභාවය ඔබ දන්නවා නම්, නූල් කැපීම ඇත්ත වශයෙන්ම rstrip ට වඩා වේගවත් වේ. මෙය නිදර්ශනය කිරීම සඳහා කුඩා පරීක්ෂණයක්:

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()මෙම සංගීත අවසන් අකැමති අකුරු අඩංගු සමහර සොයා නම් පමණක්, ඔවුන් අහිමි මස් කැබලි නම් පළමු චෙක්පත්. කරුණාකර අක්ෂර සඳහා යම් චෙක්පතක් ක්‍රියාත්මක කර method1agin පරීක්ෂා කරන්න!
spky

පිළිතුරට හැඳින්වීමේදී මා පැවසූ පරිදි: නව රේඛා ප්‍රස්ථාරයේ ස්වභාවය ඔබ දන්නේ නම් මෙය ප්‍රයෝජනවත් වේ. ඔබ එසේ නොවේ නම්, ඔබට පැහැදිලිවම යම් ආකාරයක අක්ෂර පරීක්‍ෂණයක් ක්‍රියාත්මක කළ යුතුය - නැතහොත් rstrip භාවිතා කරන්න. මම අදහස් කළේ rstrip ට “අසාධාරණ” යැයි නොව, සමහර අවස්ථාවන්හිදී සලකා බැලීම වටී විය හැකි එතරම් වැදගත් නොවන වෙනසක් නිරූපණය කරන්න.
ස්ටීවන් මිලර්

1

මෙය වින්ඩෝස් සහ ලිනක්ස් සඳහා ක්‍රියා කරනු ඇත (ඔබ නැවත විසඳුමක් පමණක් සොයන්නේ නම් නැවත උප සමඟ තරමක් මිල අධික වේ)

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


3
re.searchඔබට අවශ්‍ය තැන භාවිතා කරන්නේ ඇයි re.sub?
wjandrea

-1

සියල්ල අල්ලා ගන්න:

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

5
rstripනිත්‍ය ප්‍රකාශනය නොගනී. "hi|||\n\n".rstrip("\r|\n")ප්‍රතිලාභ"hi"
Flimm

-1

පළමු බෙදීම් රේඛා ඉන්පසු ඔබ කැමති ඕනෑම බෙදුම්කරුවෙකු සමඟ සම්බන්ධ වන්න:

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

චාම් එකක් වගේ වැඩ කළ යුතුයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.