Как удалить левую часть строки? - PullRequest
115 голосов
/ 01 марта 2009

У меня есть простой код на Python, который ищет в файлах строку, например. path=c:\path, в результате чего c:\path может отличаться. Текущий код:

def findPath( i_file) :
  lines = open( i_file ).readlines()
  for line in lines :
    if line.startswith( "Path=" ) :
      return # what to do here in order to get line content after "Path=" ?

Какой простой способ получить текст строки после Path=? Есть ли простой метод, без замыканий, размышлений или других эзотерических вещей?

Ответы [ 19 ]

172 голосов
/ 01 марта 2009

Если строка фиксированная, вы можете просто использовать:

if line.startswith("Path="):
    return line[5:]

, который дает вам все, начиная с позиции 5 в строке (строка также является последовательностью, поэтому здесь также работают эти операторы последовательности).

Или вы можете разбить строку на первый =:

if "=" in line:
    param, value = line.split("=",1)

Тогда param - это «Path», а значение - остаток после первого =.

110 голосов
/ 01 марта 2009

Удалить префикс из строки

# ...
if line.startswith(prefix):
   return line[len(prefix):]

Разделить при первом появлении разделителя через str.partition()

def findvar(filename, varname="Path", sep="=") :
    for line in open(filename):
        if line.startswith(varname + sep):
           head, sep_, tail = line.partition(sep) # instead of `str.split()`
           assert head == varname
           assert sep_ == sep
           return tail

Анализ INI-подобного файла с ConfigParser

from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read(filename) # requires section headers to be present

path = config.get(section, 'path', raw=1) # case-insensitive, no interpolation

Другие опции

19 голосов
/ 01 марта 2009

Для нарезки (условной или безусловной) в целом я предпочитаю то, что недавно предложил коллега; Используйте замену пустой строкой. Проще читать код, меньше кода (иногда) и меньше риск указать неправильное количество символов. Хорошо; Я не использую Python, но на других языках я предпочитаю такой подход:

rightmost = full_path.replace('Path=', '', 1)

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

rightmost = re.compile('^Path=').sub('', full_path)

Основное отличие от того, что было предложено выше, заключается в том, что в нем не задействовано ни «магическое число» (5), ни необходимость указывать как «5» , так и строка «Path= ', Другими словами, я предпочитаю этот подход с точки зрения обслуживания кода.

16 голосов
/ 16 сентября 2011
def remove_prefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text

Не устоял, выполняя это в одной строке. Требуется Python 2.5 +.

14 голосов
/ 14 марта 2011

Я предпочитаю pop индексированию [-1]:

value = line.split("Path=", 1).pop()

до

value = line.split("Path=", 1)[1]
param, value = line.split("Path=", 1)
9 голосов
/ 30 сентября 2013

Или почему бы не

if line.startswith(prefix):
    return line.replace(prefix, '', 1)
5 голосов
/ 12 ноября 2013

Как насчет ..

>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')

Эта тройка является головой, разделителем и хвостом .

3 голосов
/ 01 марта 2009
>>> import re

>>> p = re.compile(r'path=(.*)', re.IGNORECASE)

>>> path = "path=c:\path"

>>> re.match(p, path).group(1)
'c:\\path'
3 голосов
/ 01 марта 2009

Самый простой способ, который я могу придумать, - это нарезка-

def findPath( i_file): 
    lines = open( i_file ).readlines() 
    for line in lines: 
        if line.startswith( "Path=" ) : 
            return line[5:]

Быстрая заметка о записи срезов, в которой используются два индекса вместо обычного. Первый индекс указывает первый элемент последовательности, которую вы хотите включить в слайс , а последний индекс - это индекс сразу после последнего элемента, который вы хотите включить в слайс.
Например:

sequenceObj[firstIndex:lastIndex]

Срез состоит из всех элементов от firstIndex до lastIndex, включая firstIndex, а не lastIndex. Если первый индекс опущен, по умолчанию используется начало последовательности. Если последний индекс опущен, он включает все элементы вплоть до последнего элемента в последовательности. Отрицательные показатели также допускаются. Используйте Google, чтобы узнать больше о теме.

2 голосов
/ 01 февраля 2016

Еще один простой однострочник, который здесь не упоминался:

value = line.split("Path=", 1)[-1]

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

>>> print("prefixfoobar".split("foo", 1)[-1])
"bar"

>>> print("foofoobar".split("foo", 1)[-1])
"foobar"

>>> print("foobar".split("foo", 1)[-1])
"bar"

>>> print("bar".split("foo", 1)[-1])
"bar"

>>> print("".split("foo", 1)[-1])
""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...