2016-12-19 20 views
2

これはおそらく非常に簡単ですが、私は間違っていると感じています。 のは、私は次の文字列があるとしましょう:文字列からキーと値を抽出すると

user: bob status: married age:45 

は今、私のような何かにそれを打破したい:私は汚い分割多くの作業をしています現時点では

user = 'bob' 
status ='married' 
age = 45 

が、可能ちゃがありますRegexを使ったより良いPythonの方法。 は、ここで私は何をすべきかです:

full_text = 'user: bob status: married age:45' 
type = 'user'   
cut_string = full_text_string.split(type + ":", 1)[1].split(" ")[0] 

ありがとう!

+1

're.findall(r '(\ w +))のようなものを使用してください:((?:(?!\ w +:))*)'、s)' –

+2

':'と ' 「45」も? –

+0

ああ、うーん、それはとても素晴らしいウィクターだ。しかし、あなたはそれが何をしているのかを教えてください?私はこの魔法を学びたいと思っています –

答えて

3

私の解決策です。正規表現:(\w+)\s*:\s*((?:\w+\b\s*)+)(?!\s*:)

import re 

s = 'user: bob status: married with children age:45' 

pat = re.compile(r'(\w+)\s*:\s*((?:\w+\b\s*)+)(?!\s*:)') 

print(pat.findall(s)) 

プリント

[('user', 'bob '), ('status', 'married with children '), ('age', '45')] 

あなたはその後、これが戻って与えるタイプの右

0

​​

を取得するためにast.literal_evalのようなものを使用することができます。[('user', 'bob'), ('status', 'married'), ('age', '45')]

最初のグループは非捕捉グループです。これはfindallの結果に含まれないことを意味します。

[0-9a-z-A-Z]部分は\wに相当します。

0

我々はおそらく可能であれば正規表現を避ける私たちの人のために:あなたはage:45の間のスペースを持っていた場合

>>> full_text='user: bob status: married age:45' 
>>> alt_text = full_text.replace(':',' ').split() 
>>> print alt_text[0],"=",alt_text[1] 
>>> print alt_text[2],"=",alt_text[3] 
>>> print alt_text[4],"=",alt_text[5] 
user = bob 
status = married 
age = 45 

あなただけfull_text.split()が十分でreplaceを使用する必要はありません。

関連する問題