Подтвердить что ты не робот

Как разбить строку на первый экземпляр разделителя в 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 делает это? Если бы не предложение было бы оценено!

4b9b3361

Ответ 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')