Как удалить левую часть строки?

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

def find_path(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=?

Ответ 1

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

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

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

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

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

Тогда param является "Путь", а значение остается после первого =.

Ответ 2

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

# ...
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

Parse 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

Другие опции

Ответ 3

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

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

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

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

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

Ответ 4

def remove_prefix(text, prefix):
    return text[len(prefix):] if text.startswith(prefix) else text

Ответ 5

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

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

к

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

Ответ 6

Или почему не

if line.startswith(prefix):
    return line.replace(prefix, '', 1)

Ответ 8

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

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

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

sequence_obj[first_index:last_index]

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

Ответ 9

>>> import re

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

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

>>> re.match(p, path).group(1)
'c:\\path'

Ответ 10

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

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])
""

Ответ 11

line[5:]

дает символы после первых пяти.

Ответ 12

line[5:] даст нужную подстроку. Найдите introduction и найдите "ноту среза"

Ответ 13

Если вы знаете, что понимаете списки:

lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]

Ответ 14

Поп-версия была не совсем правильной. Я думаю, вы хотите:

>>> print('foofoobar'.split('foo', 1).pop())
foobar

Ответ 15

Я предполагаю, что вы точно ищете

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

Ответ 16

не имея необходимости писать функцию, она будет разбиваться по списку, в этом случае "Mr. | Dr. | Mrs.." выберите все после разделения с [1], затем снова разделите и возьмите любой элемент. В приведенном ниже примере возвращается "Моррис".

re.split('Mr.|Dr.|Mrs.', 'Mr. Morgan Morris')[1].split()[1]

Ответ 17

Почему бы не использовать регулярное выражение с escape? ^ соответствует начальной части строки и re.MULTILINE соответствует каждой строке. re.escape гарантирует точное совпадение.

>>> print(re.sub('^' + re.escape('path='), repl='', string='path=c:\path\nd:\path2', flags=re.MULTILINE))
c:\path
d:\path2

Ответ 18

Это очень похоже на технику с другими ответами, но без повторяющихся строковых операций, способности определить, был ли префикс или нет, и все еще вполне читабельно:

parts = the_string.split(prefix_to_remove, 1):
    if len(parts) == 2:
        #  do things with parts[1]
        pass

Ответ 19

Попробуйте следующий код

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