Как указывает thedz , вы можете предоставить аргумент для удаления произвольных символов для любой из этих функций, например:
s = s.strip(' \t\n\r')
Это лишит любое пространство, \t, \n, или \rсимволы , с левой стороны, правая или обе стороны строки.
В приведенных выше примерах удаляются только строки с левой и правой сторон строк. Если вы также хотите удалить символы из середины строки, попробуйте re.sub:
Последний пример точно такой же, как и при использовании str.replace(" ",""). Вам не нужно использовать re, если у вас есть более одного пробела, то ваш пример не работает. []предназначен для маркировки отдельных символов, это не нужно, если вы используете просто \s. Используйте либо \s+или [\s]+(ненужными) , но [\s+]не делает работу, в частности , если вы хотите заменить несколько пробелов ни с одной , как превращение "this example" в "this example".
Хорхе Э. Кардона
3
@ JorgeE.Cardona - одна вещь, в которой вы немного ошибаетесь - \sбудет включать вкладки, а replace(" ", "")не будет.
Вы не скомпилировали свое регулярное выражение. Вы должны сделать этоpat = re.compile(r'\s+')
Эван Фосмарк
Как правило , вы не хотите , чтобы sub(" ", s)не ""позже сольется слова , и вы больше не будете иметь возможность использовать .split(" ")для разбития.
user3467349
было бы неплохо увидеть выход printзаявлений
Рон Кляйн
19
Вы также можете использовать очень простую и базовую функцию: str.replace () , работает с пробелами и вкладками:
Но это, увы, также удаляет внутреннее пространство, в то время как пример в оригинальном вопросе оставляет внутренние пространства нетронутыми.
Брэндон Родс
12
#how to trim a multi line string or a file
s=""" line one
\tline two\t
line three """#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.
s1=s.splitlines()print s1
[' line one','\tline two\t','line three ']print[i.strip()for i in s1]['line one','line two','line three']#more details:#we could also have used a forloop from the begining:for line in s.splitlines():
line=line.strip()
process(line)#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:for line in my_file:
line=line.strip()
process(line)#moot point: note splitlines() removed the newline characters, we can keep them by passing True:#although split() will then remove them anyway..
s2=s.splitlines(True)print s2
[' line one\n','\tline two\t\n','line three ']
Пробел включает в себя пробел, вкладки и CRLF . Таким образом, элегантная и однострочная строковая функция, которую мы можем использовать, это translate .
Посмотрев здесь несколько решений с различной степенью понимания, я подумал, что делать, если строка была разделена запятой ...
проблема
При попытке обработать CSV контактной информации мне нужно было решить эту проблему: обрезать лишние пробелы и некоторые ненужные, но сохранить запятые и внутренние пробелы. Работая с полем, содержащим заметки на контактах, я хотел убрать мусор, оставив хорошие вещи. Обрезав все знаки препинания и разметки, я не хотел терять пробелы между составными токенами, так как не хотел потом перестраивать.
регулярные выражения и шаблоны: [\s_]+?\W+
Шаблон ищет отдельные экземпляры любого символа пробела и подчеркивания ('_') от 1 до неограниченного числа раз, когда лениво (как можно меньше символов), с [\s_]+?предшествующими несловарными символами, встречающимися от 1 до неограниченного количества символов. время с этим: \W+(эквивалентно [^a-zA-Z0-9_]). В частности, он находит полосы пробелов: нулевые символы (\ 0), символы табуляции (\ t), символы новой строки (\ n), прямая связь (\ f), возврат каретки (\ r).
Я вижу в этом преимущество в два раза:
что он не удаляет пробелы между полными словами / токенами, которые вы, возможно, захотите хранить вместе;
Встроенный в Python строковый метод strip()не обрабатывает внутри строки, только левый и правый концы, и аргумент по умолчанию равен нулю символов (см. Пример ниже: несколько символов новой строки находятся в тексте, и strip()не удаляет их все, в то время как шаблон регулярного выражения) ,text.strip(' \n\t\r')
Это выходит за рамки вопроса OP, но я думаю, что есть много случаев, когда у нас могут быть странные, патологические экземпляры в текстовых данных, как я это делал (некоторые, как экранирующие символы заканчивались в некотором тексте). Более того, в строках, подобных списку, мы не хотим исключать разделитель, если только разделитель не разделяет два пробельных символа или какой-либо не-символьный символ, такой как '-,' или '-, ,,,'.
NB: Не говорить о разделителе самого CSV. Только экземпляры в CSV, где данные подобны списку, то есть представляют собой строку подстрок cs.
Полное раскрытие: я манипулировал текстом только около месяца, и проверяю только последние две недели, так что я уверен, что есть некоторые нюансы, которые мне не хватает. Тем не менее, для небольших коллекций строк (мои находятся в кадре данных из 12 000 строк и 40 нечетных столбцов), в качестве последнего шага после прохода для удаления посторонних символов, это работает исключительно хорошо, особенно если вы вводите дополнительные пробелы, где вы хотите отделить текст, объединенный не-словесным символом, но не хотите добавлять пробелы там, где их раньше не было.
Пример:
import re
text ="\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109 \n\n\n\nklkjsdf\""print(f"Here is the text as formatted:\n{text}\n")print()print("Trimming both the whitespaces and the non-word characters that follow them.")print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)print(clean_text)print()print("what about 'strip()'?")print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')# strip out whitespace?print()print(f"Here is the text, formatted as is:\n{clean_text}\n")print()print("Are 'text' and 'clean_text' unchanged?")print(clean_text == text)
Это выводит:
Hereis the text as formatted:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
using regex to trim both the whitespaces and the non-word characters that follow them."portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, jim.somedude@blahblah.com, dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"Very nice.What about 'strip()'?Hereis the text, formatted asis:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Hereis the text, after stipping with'strip':"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Are'text'and'clean_text' unchanged?'True'
Таким образом, полоса удаляет один пробел за раз. Так что в случае с ОП, strip()все нормально. но если все усложняется, регулярные выражения и аналогичный шаблон могут иметь некоторое значение для более общих настроек.
Если вы хотите обрезать пропуски только в начале и в конце строки, вы можете сделать что-то вроде этого:
some_string =" Hello, world!\n "
new_string = some_string.strip()# new_string is now "Hello, world!"
Это работает очень похоже на метод QString :: trimmed () в Qt, так как удаляет начальные и конечные пробелы, оставляя внутренние пробелы в покое.
Но если вы хотите что-то вроде метода Qtring :: simpified () в Qt, который не только удаляет начальные и конечные пробелы, но также «сжимает» все последовательные внутренние пробелы в один пробел, вы можете использовать комбинацию .split()и " ".join, например, так:
some_string ="\t Hello, \n\t world!\n "
new_string =" ".join(some_string.split())# new_string is now "Hello, world!"
В этом последнем примере каждая последовательность внутренних пробелов заменяется одним пробелом, в то же время обрезая пробелы в начале и конце строки.
>>> myStr ="Hi\n Stack Over \r flow!">>> charList =[u"\u005Cn",u"\u005Cr",u"\u005Ct"]>>>import re
>>>for i in charList:
myStr = re.sub(i, r"", myStr)>>> myStr
'Hi Stack Over flow'
Примечание: это только для удаления "\ n", "\ r" и "\ t". Не удаляет лишние пробелы.
Зачем использовать регулярное выражение, когда s.strip()именно это?
Нед Бэтчелдер
1
s.strip()обрабатывает только начальные пробелы, но не пробелы, «обнаруженные» после удаления других нежелательных символов. Обратите внимание, что это удалит даже пробелы после финального лидерства\n
Rafe
Кто-то отверг этот ответ, но не объяснил, почему он ошибочен. Позор вам (@NedBatchelder, если вы проголосовали против, пожалуйста, поменяйте местами, когда я объяснил ваш вопрос, и вы не упомянули ничего, что фактически было нарушено моим ответом)
Rafe
10
Rafe, вы можете перепроверить: s.strip()выдает точно такой же результат, как и ваше регулярное выражение.
Нед Бэтчелдер
3
@Rafe, ты путаешь это с отделкой. Газа делает необходимые операции.
string.whitespace
.Ответы:
Пробелы с обеих сторон:
Пробелы на правой стороне:
Пробелы на левой стороне:
Как указывает thedz , вы можете предоставить аргумент для удаления произвольных символов для любой из этих функций, например:
Это лишит любое пространство,
\t
,\n
, или\r
символы , с левой стороны, правая или обе стороны строки.В приведенных выше примерах удаляются только строки с левой и правой сторон строк. Если вы также хотите удалить символы из середины строки, попробуйте
re.sub
:Это должно распечатать:
источник
str.replace(" ","")
. Вам не нужно использоватьre
, если у вас есть более одного пробела, то ваш пример не работает.[]
предназначен для маркировки отдельных символов, это не нужно, если вы используете просто\s
. Используйте либо\s+
или[\s]+
(ненужными) , но[\s+]
не делает работу, в частности , если вы хотите заменить несколько пробелов ни с одной , как превращение"this example"
в"this example"
.\s
будет включать вкладки, аreplace(" ", "")
не будет.trim
Метод Python называетсяstrip
:источник
Для ведущих и конечных пробелов:
В противном случае регулярное выражение работает:
источник
pat = re.compile(r'\s+')
sub(" ", s)
не""
позже сольется слова , и вы больше не будете иметь возможность использовать.split(" ")
для разбития.print
заявленийВы также можете использовать очень простую и базовую функцию: str.replace () , работает с пробелами и вкладками:
Просто и легко.
источник
источник
Никто еще не опубликовал эти решения регулярных выражений.
Совпадение:
Поиск (вы должны по-разному обрабатывать регистр ввода «только пробелы»):
Если вы используете
re.sub
, вы можете удалить внутренний пробел, что может быть нежелательным.источник
Пробел включает в себя пробел, вкладки и CRLF . Таким образом, элегантная и однострочная строковая функция, которую мы можем использовать, это translate .
' hello apple'.translate(None, ' \n\t\r')
ИЛИ если вы хотите быть тщательным
источник
Это удалит все ненужные пробелы и символы новой строки. Надеюсь это поможет
Это приведет к:
«a b \ nc» будет изменен на «ab c»
источник
вывод:
Добавление комментария Le Droid к ответу. Разделить пробелом:
вывод:
источник
При использовании Python 3: в вашем операторе печати завершите с sep = "". Это выделит все пространства.
ПРИМЕР:
Это напечатает: я люблю картошку.
Вместо: я люблю картошку.
В вашем случае, так как вы пытаетесь добраться до \ t, выполните sep = "\ t"
источник
Посмотрев здесь несколько решений с различной степенью понимания, я подумал, что делать, если строка была разделена запятой ...
проблема
При попытке обработать CSV контактной информации мне нужно было решить эту проблему: обрезать лишние пробелы и некоторые ненужные, но сохранить запятые и внутренние пробелы. Работая с полем, содержащим заметки на контактах, я хотел убрать мусор, оставив хорошие вещи. Обрезав все знаки препинания и разметки, я не хотел терять пробелы между составными токенами, так как не хотел потом перестраивать.
регулярные выражения и шаблоны:
[\s_]+?\W+
Шаблон ищет отдельные экземпляры любого символа пробела и подчеркивания ('_') от 1 до неограниченного числа раз, когда лениво (как можно меньше символов), с
[\s_]+?
предшествующими несловарными символами, встречающимися от 1 до неограниченного количества символов. время с этим:\W+
(эквивалентно[^a-zA-Z0-9_]
). В частности, он находит полосы пробелов: нулевые символы (\ 0), символы табуляции (\ t), символы новой строки (\ n), прямая связь (\ f), возврат каретки (\ r).Я вижу в этом преимущество в два раза:
что он не удаляет пробелы между полными словами / токенами, которые вы, возможно, захотите хранить вместе;
Встроенный в Python строковый метод
strip()
не обрабатывает внутри строки, только левый и правый концы, и аргумент по умолчанию равен нулю символов (см. Пример ниже: несколько символов новой строки находятся в тексте, иstrip()
не удаляет их все, в то время как шаблон регулярного выражения) ,text.strip(' \n\t\r')
Это выходит за рамки вопроса OP, но я думаю, что есть много случаев, когда у нас могут быть странные, патологические экземпляры в текстовых данных, как я это делал (некоторые, как экранирующие символы заканчивались в некотором тексте). Более того, в строках, подобных списку, мы не хотим исключать разделитель, если только разделитель не разделяет два пробельных символа или какой-либо не-символьный символ, такой как '-,' или '-, ,,,'.
NB: Не говорить о разделителе самого CSV. Только экземпляры в CSV, где данные подобны списку, то есть представляют собой строку подстрок cs.
Полное раскрытие: я манипулировал текстом только около месяца, и проверяю только последние две недели, так что я уверен, что есть некоторые нюансы, которые мне не хватает. Тем не менее, для небольших коллекций строк (мои находятся в кадре данных из 12 000 строк и 40 нечетных столбцов), в качестве последнего шага после прохода для удаления посторонних символов, это работает исключительно хорошо, особенно если вы вводите дополнительные пробелы, где вы хотите отделить текст, объединенный не-словесным символом, но не хотите добавлять пробелы там, где их раньше не было.
Пример:
Это выводит:
Таким образом, полоса удаляет один пробел за раз. Так что в случае с ОП,
strip()
все нормально. но если все усложняется, регулярные выражения и аналогичный шаблон могут иметь некоторое значение для более общих настроек.увидеть это в действии
источник
попробуй перевести
источник
Если вы хотите обрезать пропуски только в начале и в конце строки, вы можете сделать что-то вроде этого:
Это работает очень похоже на метод QString :: trimmed () в Qt, так как удаляет начальные и конечные пробелы, оставляя внутренние пробелы в покое.
Но если вы хотите что-то вроде метода Qtring :: simpified () в Qt, который не только удаляет начальные и конечные пробелы, но также «сжимает» все последовательные внутренние пробелы в один пробел, вы можете использовать комбинацию
.split()
и" ".join
, например, так:В этом последнем примере каждая последовательность внутренних пробелов заменяется одним пробелом, в то же время обрезая пробелы в начале и конце строки.
источник
Как правило, я использую следующий метод:
Примечание: это только для удаления "\ n", "\ r" и "\ t". Не удаляет лишние пробелы.
источник
для удаления пробелов из середины строки
вывод:
источник
Это удалит все пробелы и символы новой строки как в начале, так и в конце строки:
источник
s.strip()
именно это?s.strip()
обрабатывает только начальные пробелы, но не пробелы, «обнаруженные» после удаления других нежелательных символов. Обратите внимание, что это удалит даже пробелы после финального лидерства\n
s.strip()
выдает точно такой же результат, как и ваше регулярное выражение.