Как удалить левую часть строки?
У меня есть простой код 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)
Ответ 7
Как насчет..
>>> line = r'path=c:\path'
>>> line.partition('path=')
('', 'path=', 'c:\\path')
Этот триплет является головой, разделителем и хвостом.
Ответ 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:]