12

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 はデフォルトでこれを行いますか? そうでない場合は、提案をいただければ幸いです。

4

6 に答える 6

25

これがstr.partition目的です:

>>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.partition('=')
('jvm.args', '=', ' -Dappdynamics.com=true, -Dsomeotherparam=false,')

ドキュメントから:

str.partition(sep)

sep の最初の出現で文字列を分割し、区切り記号の前の部分、区切り記号自体、および区切り記号の後の部分を含む 3 つのタプルを返します。区切り文字が見つからない場合は、文字列自体とそれに続く 2 つの空の文字列を含む 3 つのタプルを返します。

バージョン 2.5 の新機能。

于 2012-06-13T06:17:09.253 に答える
11

ドキュメントから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,']
于 2012-06-13T06:26:46.363 に答える
2

私はこれがうまくいくはずだと思います:

lineSplit = line.split("=")
key = lineSplit[0]
value = "=".join(lineSplit[1:])

コメントで誰かが示唆したように、文字列を一度解析して "=" を見つけ、その時点から分割することができます。

于 2012-06-13T06:18:18.550 に答える
1

より低いレベルで役立つ可能性があるため、コメントを (テストされていない) コードに変換すると思いますstr.partition()。たとえば、正規表現を必要とするより複雑な区切り文字の場合re.match()、 find を使用できますpos。しかし、Triptych の提案には私の票が入りました。

どうぞ:

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:]
于 2012-06-13T06:24:03.303 に答える
0

前の質問で示唆されているように、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')
于 2012-06-13T07:04:48.473 に答える
0

正規表現の使用は完全にスキップします。単純な文字列比較では、正規表現は実際には必要ありません。

コード例では、インライン メソッドを使用して、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'}

私はこれがあなたが実際に求めているものだと思います;)

于 2012-06-13T06:49:46.530 に答える