2012-06-13 21 views
12

文字列内の区切り文字の最初のインスタンスのみで、Pythonを使用して文字列を分割する必要があります。Pythonのデリミタの最初のインスタンスで文字列を分割する方法

私のコード:私は私のコードはincidently最初の時にキーと値の変数にjvm.argsを分割したい

'jvm.args = -Dappdynamics.com=true, -Dsomeotherparam=false,' 

':

for line in conf.readlines(): 
    if re.search('jvm.args',line): 
     key,value= split('=',line) 
     default_args=val 

問題がjvm.argsを含む、lineである。このようになります。 = '。 re.splitはデフォルトでこれを行いますか?そうでない場合は、提案をいただければ幸いです!ドキュメントから

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

+1

は、あなたがサンプル出力 – shiva

+2

を投稿することができ、なぜ単なる文字列のスキャンで、区切り文字に一致するものを探してみませんか?次に、線[:pos]と線[pos + 1:]で2つのスライスを抽出するだけです。 –

+2

サンプル出力が役に立ちます。 – damned

答えて

25

これはstr.partitionが何のためにあるのかである

str.partition(9月)

スプリット9月の最初の発生時に、文字列、 を返し、セパレータの前の部分を含む3タプルを返します。 セパレータ自体、およびその後の部分eセパレータ。セパレータ が見つからない場合は、文字列自体を含む3タプルを返し、次に を2つの空の文字列で返します。

バージョン2.5の新機能。

+0

+1 - 決して' partition() 'について知りませんでした。 –

+0

+1ベストメソッド、最速です。 – jamylak

+0

@jamylakが最速ですか? –

2

私は、これは動作するはずだと思う:

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

誰かがコメントで示唆したように:あなたは一度だけ文字列を解析し、検索することができ、「=」、そのポイントからそれを分割することにより行いました。

+0

-1 'value = '、'。join(key、" = "。join(lineSplit [1:])))' は正しい方法です。 –

+2

pythonではnames_with_underscoresが推奨されています。 – jamylak

+0

@jamylak私はjavaとpythonの間で頻繁に切り替えるとこれは私が従うパターンです:)しかし、提案に感謝! – damned

1

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:] 
10

split documentation

str.split([9月[、maxsplit個]])

戻るから、文字列内の単語のリストを、区切り文字列としてsepを使用します。 maxsplit個が与えられた場合、ほとんどのmaxsplit個の分割が行われている時に 、

>>> 'jvm.args= -Dappdynamics.com=true, -Dsomeotherparam=false,'.split('=',1) 
['jvm.args', ' -Dappdynamics.com=true, -Dsomeotherparam=false,'] 
0

私は、単純な文字列の比較のために、完全に正規表現を使用して飛ばしたい(したがって、リストは 最もmaxsplit個+ 1つの要素になります)彼らは本当に必要ではありません。

のコード例は、値が(私は、ファイルの反復コードに煩わさていませんでした、あなたの例が正しい)の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(','))) 

印刷argsが返されます:

{'appdynamics.com': 'true', 'someotherparam': 'false'} 

私は、これはあなたがした後、実際には何かであると仮定;)

0

あなたprevious question、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') 
関連する問題