Для инструментов or-tools мы предоставляем только минимальный API для линейного решателя. Если ваша проблема более структурирована (планирование, маршрутизация, CP-подобные ограничения), вы можете взглянуть на интерфейс CP-SAT:
Если строка починена, можно просто использовать:
if line.startswith("Path="):
return line[5:]
, который дает Вам все от позиции 5 на в строке (строка является также последовательностью так эти операторы последовательности работа здесь, также).
Или можно разделить строку в первом =
:
if "=" in line:
param, value = line.split("=",1)
Тогда параметрический усилитель является "Путем", и значение - остальные после первого =.
line[5:]
даст подстроку, которую Вы хотите. Ищите введение и ищите 'нотацию части'
Если Вы знаете понимания списка:
lines = [line[5:] for line in file.readlines() if line[:5] == "Path="]
line[5:]
дает Вам символы после первых пяти.
Самым простым путем я могу думать, с разрезанием:
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 для получения дополнительной информации о теме.
>>> import re
>>> p = re.compile(r'path=(.*)', re.IGNORECASE)
>>> path = "path=c:\path"
>>> re.match(p, path).group(1)
'c:\\path'
Для разрезания (условное выражение или неусловное выражение) в целом я предпочитаю что коллега, предложенный недавно; Используйте замену с пустой строкой. Легче прочитать код, меньше кода (иногда) и меньше риска определения неправильного количества символов. Хорошо; я не использую Python, но на других языках я действительно предпочитаю этот подход:
rightmost = full_path.replace('Path=', '', 1)
или - для следования до первого комментария к этому сообщению - если это должно только быть сделано , если строка запускается с Path
:
rightmost = re.compile('^Path=').sub('', full_path)
основное различие для части из того, что было предложено выше, - то, что нет никакого "магического числа" (5) включено, ни никакая потребность определить и' 5
' и строка' Path=
', Другими словами, я предпочитаю этот подход с точки зрения обслуживания кода.
# ...
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
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