Простой способ удалить несколько пробелов в строке? - PullRequest
300 голосов
/ 10 октября 2009

Предположим, это строка:

The   fox jumped   over    the log.

Это приведет к:

The fox jumped over the log.

Какой самый простой 1-2 лайнер может это сделать? Не разбивая и не заходя в списки ...

Ответы [ 21 ]

2 голосов
/ 29 мая 2016

Одна строка кода для удаления всех лишних пробелов до, после и внутри предложения:

sentence = "  The   fox jumped   over    the log.  "
sentence = ' '.join(filter(None,sentence.split(' ')))

Пояснение:

  1. Разбить всю строку на список.
  2. Отфильтровать пустые элементы из списка.
  3. Воссоединить оставшиеся элементы * с одним пробелом

* Остальными элементами должны быть слова или слова с пунктуацией и т. Д. Я не проверял это подробно, но это должно стать хорошей отправной точкой. Всего наилучшего!

2 голосов
/ 13 августа 2017

В некоторых случаях желательно заменить последовательные вхождения каждого символа пробела одним экземпляром , который символа. Для этого вы бы использовали регулярное выражение с обратными ссылками.

(\s)\1{1,} соответствует любому символу пробела, за которым следует одно или несколько вхождений этого символа. Теперь все, что вам нужно сделать, это указать первую группу (\1) в качестве замены для матча.

Оборачиваем это в функцию:

import re

def normalize_whitespace(string):
    return re.sub(r'(\s)\1{1,}', r'\1', string)
>>> normalize_whitespace('The   fox jumped   over    the log.')
'The fox jumped over the log.'
>>> normalize_whitespace('First    line\t\t\t \n\n\nSecond    line')
'First line\t \nSecond line'
2 голосов
/ 19 октября 2018
i have tried the following method and it even works with the extreme case 
like str1='          i   live    on    earth           '

' '.join(str1.split())

but if you prefer regular expression it can be done as:-

re.sub('\s+',' ',str1)

although some preprocessing has to be done in order to remove the trailing and ending space.
1 голос
/ 03 марта 2018

Самое быстрое, что вы можете получить для пользовательских строк:

if '  ' in text:
    while '  ' in text:
        text = text.replace('  ', ' ')

Короткое замыкание делает его немного быстрее, чем полный ответ pythonlarry . Пойдите на это, если вы стремитесь к эффективности и строго ищете, чтобы отсеять лишние пробелы из единого пробела .

1 голос
/ 15 декабря 2016
def unPretty(S):
   # given a dictionary, json, list, float, int, or even a string.. 
   # return a string stripped of CR, LF replaced by space, with multiple spaces reduced to one.
   return ' '.join( str(S).replace('\n',' ').replace('\r','').split() )
1 голос
/ 05 сентября 2016

Это также, кажется, работает:

while "  " in s:
    s=s.replace("  "," ")

Где переменная s представляет вашу строку.

0 голосов
/ 12 декабря 2018

У меня есть простой метод, который использовался в колледже.

line = "I     have            a       nice    day."

end = 1000
while end != 0:
    line.replace("  ", " ")
    end -= 1

Это заменит каждый двойной пробел одним пробелом и сделает это 1000 раз. Это означает, что вы можете иметь 2000 дополнительных пробелов и все равно будете работать. :)

0 голосов
/ 08 ноября 2014

Если вы используете пробелы для разделения на None, пустая строка не будет возвращена в возвращаемое значение.

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

0 голосов
/ 18 декабря 2017

Я не слишком много читал в других примерах, но я только что создал этот метод для объединения нескольких последовательных пробелов.

Он не использует никаких библиотек, и хотя он относительно длинный с точки зрения длины скрипта, он не является сложной реализацией

def spaceMatcher(command):
    """
    function defined to consolidate multiple whitespace characters in 
    strings to a single space
    """
    #initiate index to flag if more than 1 consecutive character 
    iteration
    space_match = 0
    space_char = ""
    for char in command:
      if char == " ":
          space_match += 1
          space_char += " "
      elif (char != " ") & (space_match > 1):
          new_command = command.replace(space_char, " ")
          space_match = 0
          space_char = ""
      elif char != " ":
          space_match = 0
          space_char = ""
   return new_command

command = None
command = str(input("Please enter a command ->"))
print(spaceMatcher(command))
print(list(spaceMatcher(command)))
0 голосов
/ 14 февраля 2016
string='This is a             string full of spaces          and taps'
string=string.split(' ')
while '' in string:
    string.remove('')
string=' '.join(string)
print(string)

Результаты

Это строка, заполненная пробелами и пробелами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...