Как разбить строку на первый экземпляр разделителя в python
Мне нужно разбить строку, используя python, но только в первом экземпляре разделителя в строке.
Мой код:
for line in conf.readlines():
if re.search('jvm.args',line):
key,value= split('=',line)
default_args=val
Задача line
, содержащая jvm.args
, выглядит следующим образом:
'jvm.args = -Dappdynamics.com=true, -Dsomeotherparam=false,'
Я хочу, чтобы мой код разбивал jvm.args
на переменные ключа и значения, связанные с первым "=". По умолчанию re.split делает это? Если бы не предложение было бы оценено!
Ответы
Ответ 1
Это то, что str.partition
для:
>>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.partition('=')
('jvm.args', '=', ' -Dappdynamics.com=true, -Dsomeotherparam=false,')
Из документов:
str.partition(септет)
Разделите строку при первом вводе sep, и верните 3-кортеж, содержащий деталь перед разделителем, сепаратор и часть после разделителя. Если разделитель не найден, верните 3-кортеж, содержащий собственно строку, затем двумя пустыми строками.
Новое в версии 2.5.
Ответ 2
Из split
документации
str.split([sep [, maxsplit]])
Возвращает список слов в строке, используя sep в качестве строки разделителя. Если задано maxsplit, выполняется максимум максимум maxsplit (таким образом, список будет иметь большинство maxsplit + 1 элемент)
>>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.split('=',1)
['jvm.args', ' -Dappdynamics.com=true, -Dsomeotherparam=false,']
Ответ 3
Я думаю, что это должно сработать:
lineSplit = line.split("=")
key = lineSplit[0]
value = "=".join(lineSplit[1:])
Как кто-то предложил в комментариях: вы можете просто разобрать строку один раз и найти "=", а затем расщепить ее с этой точки.
Ответ 4
Думаю, я поменяю свой комментарий на (непроверенный) код, потому что он может быть полезен на более низком уровне, чем str.partition()
. Например, для более сложного разделителя, требующего регулярного выражения, вы можете использовать re.match()
для поиска pos
. Но предложение Триптиха получило мой голос.
Здесь вы идете:
pos = -1
for i, ch in enumerate(line):
if ch == '=':
pos = i
break
if pos < 0: raise myException()
key = line[:pos]
value = line[pos+1:]
Ответ 5
Я бы пропустил использование регулярных выражений полностью, для простого сравнения строк они действительно не требуются.
В примере кода используется встроенный метод для получения ключей, кортежей значений, которые встроенный dict использует для создания словаря (я не беспокоил код итерации файла, ваш пример там верен):
line="jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false, "
# Detect a line that starts with jvm.args
if line.strip().startswith('jvm.args'):
# Only interested in the args
_, _, args = line.partition('=')
# Method that will yield a key, value tuple if item can be converted
def key_value_iter(args):
for arg in args:
try:
key, value = arg.split('=')
# Yield tuple removing the -d prefix from the key
yield key.strip()[2:], value
except:
# A bad or empty value, just ignore these
pass
# Create a dict based on the yielded key, values
args = dict(key_value_iter(args.split(',')))
print args вернется:
{'appdynamics.com': 'true', 'someotherparam': 'false'}
Я предполагаю, что это то, что вы на самом деле после;)
Ответ 6
Как было предложено в предыдущем вопросе, ConfigParser является наиболее простым способом:
import ConfigParser
from io import StringIO
conf = u"""
[options]
foo=bar
jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,
"""
config = ConfigParser.ConfigParser()
config.readfp(StringIO(conf))
print config.get('options', 'jvm.args')