2009-08-08 2 views
4

Есть ли кросс-платформенная библиотека, которая сворачивает многострочную строку в однострочную строку без повторений пробелов?Есть ли в библиотеке функция сбрасывания строк?

Я придумал какой-нибудь снипп, но мне интересно, есть ли стандартная функция, которую я мог бы импортировать, возможно, даже оптимизирован в C?

def collapse(input): 
    import re 
    rn = re.compile(r'(\r\n)+') 
    r = re.compile(r'\r+') 
    n = re.compile(r'\n+') 
    s = re.compile(r'\ +') 
    return s.sub(' ',n.sub(' ',r.sub(' ',rn.sub(' ',input)))) 

P.S. Спасибо за хорошие наблюдения. ' '.join(input.split()), по-видимому, побеждает, поскольку он на самом деле работает быстрее примерно в два раза в моем случае по сравнению с поиском-заменой с помощью предварительно скомпилированного r'\s+' regex.

+1

Почему «кросс-платформенный» в заголовке вопроса? Почти все в Python является кросс-платформенным, за исключением специфичных для ОС. Это явно не зависит от ОС, если вы ничего не опустили. –

+0

хорошо пункт. Я не знал, что символ «\ n» является кросс-платформенным в python. Я думал, что '\ n' буквально означает специальный символ ascii. – Evgeny

+0

Это буквально означает особый символ ascii. Этот символ одинаковый на всех платформах - это новая строка. –

ответ

12

Встроенный string.split() метод разделится на пробегов пробельных, так что вы можете использовать это, а затем присоединиться результирующий список, используя пробелы, например:

' '.join(my_string.split()) 

Вот полный тестовый сценарий:

TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

print ' '.join(TEST.split()) 
# Prints: 
# This is a test with a mix of tabs, newlines and repeating whitespace 
0
multi_line.replace('\n', '') 

выполнит эту работу. '\n' - универсальный символ конца строки в python.

+1

спасибо. хорошо знать. но это не сработает, поскольку он не будет вставлять пустое место там, где это необходимо, и не будет удалять повторяющиеся пустые пространства. – Evgeny

+0

. Я не уверен, что означает @Evgeny «пустым пространством», но в любом случае предлагаемое решение не адресует Требование OP не требует повторения пробелов. –

4

вы имели правильную идею, просто нужно немного более внимательно прочитать инструкцию питона:

import re 
somewhitespace = re.compile(r'\s+') 
TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

somewhitespace.sub(' ', TEST) 

'This is a test with a mix of tabs, newlines and repeating whitespace' 
Смежные вопросы