159

Basically, I'm asking the user to input a string of text into the console, but the string is very long and includes many line breaks. How would I take the user's string and delete all line breaks to make it a single line of text. My method for acquiring the string is very simple.

string = raw_input("Please enter string: ")

Is there a different way I should be grabbing the string from the user? I'm running Python 2.7.4 on a Mac.

P.S. Clearly I'm a noob, so even if a solution isn't the most efficient, the one that uses the most simple syntax would be appreciated.

Ian Zane
  • 2,009
  • 5
  • 20
  • 21
  • http://stackoverflow.com/questions/1185524/how-to-trim-whitespace-including-tabs –  May 15 '13 at 13:27
  • 5
    @NicYoung, that is similar but different. `strip` removes whitespace at the start and end of a string, not *inside* the string... – Daren Thomas May 15 '13 at 13:33

11 Answers11

244

How do you enter line breaks with raw_input? But, once you have a string with some characters in it you want to get rid of, just replace them.

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

In the example above, I replaced all spaces. The string '\n' represents newlines. And \r represents carriage returns (if you're on windows, you might be getting these and a second replace will handle them for you!).

basically:

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

Note also, that it is a bad idea to call your variable string, as this shadows the module string. Another name I'd avoid but would love to use sometimes: file. For the same reason.

Mr_and_Mrs_D
  • 29,590
  • 35
  • 170
  • 347
Daren Thomas
  • 65,080
  • 40
  • 147
  • 198
60

You can try using string replace:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
  • 32,797
  • 13
  • 71
  • 95
37

You can split the string with no separator arg, which will treat consecutive whitespace as a single separator (including newlines and tabs). Then join using a space:

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

Sean
  • 14,835
  • 4
  • 36
  • 36
21

The canonic answer, in Python, would be :

s = ''.join(s.splitlines())

It splits the string into lines (letting Python doing it according to its own best practices). Then you merge it. Two possibilities here:

  • replace the newline by a whitespace (' '.join())
  • or without a whitespace (''.join())
fralau
  • 2,721
  • 1
  • 25
  • 38
15

updated based on Xbello comment:

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

read more here

tokhi
  • 19,860
  • 23
  • 91
  • 104
9

Another option is regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
  • 8,367
  • 8
  • 40
  • 48
  • more info on how to match consecutive linebreaks would be nice `r'[\n\r]+'` or even `r'\s+'` to replace any whitespace with a single space. – Risadinha Feb 04 '19 at 14:45
4

If anybody decides to use replace, you should try r'\n' instead '\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
  • 1
    Why? I vaguely remember why this is a good idea, but we need to document it. – Martin Burch Jul 03 '20 at 21:37
  • 1
    In my case, I needed to do this: 1. Get HTML code from DB 2. Get needed text from HTML 3. Remove all newline from text 4. Insert edited text to a spreadsheet document And it didn't work properly, unless I used `r` ( "raw string literal"). Unfortunately, I have no idea why ) – Anar Salimkhanov Jul 04 '20 at 22:32
  • 3
    **NOTE** that `r'\r'` will match the literal "backslash r" -- not the "Carriage Return" character. Use either according to your input data. – DerMike Sep 30 '20 at 16:27
3

A method taking into consideration

  • additional white characters at the beginning/end of string
  • additional white characters at the beginning/end of every line
  • various end-line characters

it takes such a multi-line string which may be messy e.g.

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

and produces nice one-line string

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

UPDATE: To fix multiple new-line character producing redundant spaces:

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

This works for the following too test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

  • This doesn't handle the case of contiguous line feeds in the middle of the string. Two line feeds result in two contiguous blanks in the output. Try "test_str = '\nhej ho \n aaa\r\n\n a\n '" – Mike Gleen Jul 11 '17 at 12:08
0

The problem with rstrip is that it does not work in all cases (as I myself have seen few). Instead you can use - text= text.replace("\n"," ") this will remove all new line \n with a space.

Thanks in advance guys for your upvotes.

0

Regular expressions is the fastest way to do this

s='''some kind   of
string with a bunch\r of

  
 extra spaces in   it'''

re.sub(r'\s(?=\s)','',re.sub(r'\s',' ',s))

result:

'some kind of string with a bunch of extra spaces in it'
Quin
  • 57
  • 9
-2

You can use

string= string.replace("\n", str())

However, sometimes it says

NoneType object has no attribute 'replace'

Thus, you shall be careful doing it. But thanks for asking about this

raw_ input !
Aqib Javed
  • 797
  • 1
  • 2
  • 10