Почему метод python str.strip() не удаляет начальные символы в этом коде?

#python #string #strip

#python #строка #Стриптиз

Вопрос:

Я использовал str.strip('0') ниже. Это не работает для начальных нулей в приведенном ниже коде.

 str1 = " 0000000this is string example....wow!!!0000000";
str1mod = str1.strip('0')
print str1mod
print len(str1mod)
str2 = "0000000this is string example....wow!!!0000000";
str2mod = str2.strip('0')
print str2mod
print len(str2mod)
  

Вывод выглядит следующим образом

  0000000this is string example....wow!!!
40
this is string example....wow!!!
32
  

Почему начальные пробелы не удаляются в str1?

Ожидалось получить вывод, подобный

  this is string example....wow!!!
40
this is string example....wow!!!
32
  

Комментарии:

1. «Почему начальные пробелы не удаляются»… потому что вы не сказали Python сделать это? Вы сказали ему удалить 0, а не пробелы.

Ответ №1:

В вашем случае нули на самом деле не являются «ведущими», им предшествует пробел, поэтому вам нужно сделать, это дважды удалить строку:

 str1 = " 0000000this is string example....wow!!!0000000";
str1mod = str1.strip().strip('0')
print str1mod
print len(str1mod)
str2 = "0000000this is string example....wow!!!0000000";
str2mod = str2.strip('0')
print str2mod
print len(str2mod)
  

Вывод в оболочке Python 2:

 Python 2.7.17 (default, Apr 15 2020, 17:20:14) 
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> str1 = " 0000000this is string example....wow!!!0000000";
>>> str1mod = str1.strip().strip('0')
>>> print str1mod
this is string example....wow!!!
>>> print len(str1mod)
32
>>> str2 = "0000000this is string example....wow!!!0000000";
>>> str2mod = str2.strip('0')
>>> print str2mod
this is string example....wow!!!
>>> print len(str2mod)
32
>>> 
>>> 
  

Ответ №2:

str.strip([chars])

Возвращает копию строки с удаленными начальными и конечными символами. chars Аргумент представляет собой строку, указывающую набор символов, которые необходимо удалить. Если опущено или None , chars аргумент по умолчанию удаляет пробелы.

Акцент мой.

strip удаляет только начальные или конечные символы. Поскольку последовательность 0 s не является ведущей — перед ней стоит пробел — она не удаляется.

Если вы хотите удалить символы из любого места строки, используйте str.remove .

Если у вас более сложные потребности, используйте re.sub , например, для удаления начальных и конечных нулей, даже если им предшествует пробел, вы можете использовать что-то вроде

 re.sub(r'^(s*)(0*)([^0]*)(0*)$', r'13')
  

Комментарии:

1. Пример кода для удаления 0 и пробела: str1mod = str1.strip(' 0') .

2. Да, однако, глядя на исходные фрагменты, похоже, что автор хочет удалить 0, не касаясь остальных.

3. Вы правы. Я этого не осознавал. В этом случае ваше регулярное выражение является лучшим решением.