Есть ли функция Python, которая будет вырезать пробелы (пробелы и табуляции) из строки?
Пример: \t example string\t
→example string
string.whitespace
.
Есть ли функция Python, которая будет вырезать пробелы (пробелы и табуляции) из строки?
Пример: \t example string\t
→example string
string.whitespace
.
Ответы:
Пробелы с обеих сторон:
s = " \t a string example\t "
s = s.strip()
Пробелы на правой стороне:
s = s.rstrip()
Пробелы на левой стороне:
s = s.lstrip()
Как указывает thedz , вы можете предоставить аргумент для удаления произвольных символов для любой из этих функций, например:
s = s.strip(' \t\n\r')
Это лишит любое пространство, \t
, \n
, или \r
символы , с левой стороны, правая или обе стороны строки.
В приведенных выше примерах удаляются только строки с левой и правой сторон строк. Если вы также хотите удалить символы из середины строки, попробуйте re.sub
:
import re
print re.sub('[\s+]', '', s)
Это должно распечатать:
astringexample
str.replace(" ","")
. Вам не нужно использовать re
, если у вас есть более одного пробела, то ваш пример не работает. []
предназначен для маркировки отдельных символов, это не нужно, если вы используете просто \s
. Используйте либо \s+
или [\s]+
(ненужными) , но [\s+]
не делает работу, в частности , если вы хотите заменить несколько пробелов ни с одной , как превращение "this example"
в "this example"
.
\s
будет включать вкладки, а replace(" ", "")
не будет.
Для ведущих и конечных пробелов:
s = ' foo \t '
print s.strip() # prints "foo"
В противном случае регулярное выражение работает:
import re
pat = re.compile(r'\s+')
s = ' \t foo \t bar \t '
print pat.sub('', s) # prints "foobar"
pat = re.compile(r'\s+')
sub(" ", s)
не ""
позже сольется слова , и вы больше не будете иметь возможность использовать .split(" ")
для разбития.
print
заявлений
Вы также можете использовать очень простую и базовую функцию: str.replace () , работает с пробелами и вкладками:
>>> whitespaces = " abcd ef gh ijkl "
>>> tabs = " abcde fgh ijkl"
>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl
Просто и легко.
#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 ']
Никто еще не опубликовал эти решения регулярных выражений.
Совпадение:
>>> import re
>>> p=re.compile('\\s*(.*\\S)?\\s*')
>>> m=p.match(' \t blah ')
>>> m.group(1)
'blah'
>>> m=p.match(' \tbl ah \t ')
>>> m.group(1)
'bl ah'
>>> m=p.match(' \t ')
>>> print m.group(1)
None
Поиск (вы должны по-разному обрабатывать регистр ввода «только пробелы»):
>>> p1=re.compile('\\S.*\\S')
>>> m=p1.search(' \tblah \t ')
>>> m.group()
'blah'
>>> m=p1.search(' \tbl ah \t ')
>>> m.group()
'bl ah'
>>> m=p1.search(' \t ')
>>> m.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
Если вы используете re.sub
, вы можете удалить внутренний пробел, что может быть нежелательным.
Пробел включает в себя пробел, вкладки и CRLF . Таким образом, элегантная и однострочная строковая функция, которую мы можем использовать, это translate .
' hello apple'.translate(None, ' \n\t\r')
ИЛИ если вы хотите быть тщательным
import string
' hello apple'.translate(None, string.whitespace)
(re.sub ('+', '', (my_str.replace ('\ n', '')))). strip ()
Это удалит все ненужные пробелы и символы новой строки. Надеюсь это поможет
import re
my_str = ' a b \n c '
formatted_str = (re.sub(' +', ' ',(my_str.replace('\n',' ')))).strip()
Это приведет к:
«a b \ nc» будет изменен на «ab c»
something = "\t please_ \t remove_ all_ \n\n\n\nwhitespaces\n\t "
something = "".join(something.split())
вывод:
please_remove_all_whitespaces
something = "\t please \t remove all extra \n\n\n\nwhitespaces\n\t "
something = " ".join(something.split())
вывод:
пожалуйста, удалите все лишние пробелы
При использовании Python 3: в вашем операторе печати завершите с sep = "". Это выделит все пространства.
ПРИМЕР:
txt="potatoes"
print("I love ",txt,"",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 нечетных столбцов), в качестве последнего шага после прохода для удаления посторонних символов, это работает исключительно хорошо, особенно если вы вводите дополнительные пробелы, где вы хотите отделить текст, объединенный не-словесным символом, но не хотите добавлять пробелы там, где их раньше не было.
Пример:
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)
Это выводит:
Here is 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()'?
Here is the text, formatted as is:
"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"
Here is 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()
все нормально. но если все усложняется, регулярные выражения и аналогичный шаблон могут иметь некоторое значение для более общих настроек.
попробуй перевести
>>> import string
>>> print '\t\r\n hello \r\n world \t\r\n'
hello
world
>>> tr = string.maketrans(string.whitespace, ' '*len(string.whitespace))
>>> '\t\r\n hello \r\n world \t\r\n'.translate(tr)
' hello world '
>>> '\t\r\n hello \r\n world \t\r\n'.translate(tr).replace(' ', '')
'helloworld'
Если вы хотите обрезать пропуски только в начале и в конце строки, вы можете сделать что-то вроде этого:
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". Не удаляет лишние пробелы.
для удаления пробелов из середины строки
$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;
вывод:
ATGCGACACGATCGACC
Это удалит все пробелы и символы новой строки как в начале, так и в конце строки:
>>> s = " \n\t \n some \n text \n "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"
s.strip()
именно это?
s.strip()
обрабатывает только начальные пробелы, но не пробелы, «обнаруженные» после удаления других нежелательных символов. Обратите внимание, что это удалит даже пробелы после финального лидерства\n
s.strip()
выдает точно такой же результат, как и ваше регулярное выражение.