2016-05-24 28 views
1

私は自分のプログラムに必要な情報を見つけることができず、誰かが私を助けてくれることを願っています。 私は、各行に数字と文字を持っています。特定の数字の前に特殊文字があります。 各行は次のようになります。特定の情報を抽出する

12456 t0 45 54 # 36478 t04 # 37489 to4 # 83940 to5 + 63748 nn 00 +374840 bb 009 + 144839 op 45 

私は彼らの前に#と+と数字を抽出する必要があります。

そして結果はこのように、3タプルのようになります。リストとして彼らの前に

(最初の数、リスト、それらの前に#を持つすべての数字(スペースまで)、+を持つすべての番号(スペースまで、to4なし、to5など)):

(12456, [36478, 37489, 83940], [63748, 375840, 144839]) 

このタスクの正規表現はありますか?ここで

答えて

0

は、あなたの行は、私は正規表現があるため、グループ化要件の仕事のための適切なツールになるだろうとは思わない文字列変数

r1= re.compile("(\d+)") 
r2 = re.compile("#\s*(\d+)") 
r3 = re.compile("\+\s*(d+)") 
(r3.search(string).group(0),r2.findall(string),r.findall(string)) 
+0

のためにありがとうございました!もう1つ質問:「+ \ s *(\ d +)」と+の代わりに*を使用すると(「\ * \ s *(\ d +)」) hm、( "#\ s *(\ d +)")もうまくいきません... r1とr3 ... –

+0

のみ\ +はエスケープ文字を意味します(+は正規表現の特殊文字です)任意の文字に一致することができます –

+0

ええ、私は*の代わりに*が必要な場合(私はこれを必要とする* 637383 \と私は正規表現の特殊文字としてエスケープしたい*)しかし、それは動作しません:AttributeError: ' NoneType 'オブジェクトには' group '属性がありません。私はちょうど+の代わりに*を入れて、うまくいきません.... –

0

で値を取得するための正規表現です。私は、次のことをお勧めしたい:これは375840を印刷していないこと

in_str = "12456 t0 45 54 # 36478 t04 # 37489 to4 # 83940 to5 + 63748 nn 00 +374840 bb 009 + 144839 op 45" 
parts = in_str.split() 
first = None 
got_hash = False 
hashes = [] 
got_plus = False 
pluses = [] 


for part in parts: 
    if first is None: 
    first = int(part) 
    elif part == "#": 
    got_hash = True 
    elif part == "+": 
    got_plus = True 
    elif got_hash: 
    hashes.append(int(part)) 
    got_hash = False 
    elif got_plus: 
    pluses.append(int(part)) 
    got_plus = False 

print ((first, hashes, pluses)) 

注意、理由は不足しているスペースの

0

は私のアドバイスは未定義のために抽出するための3つの簡単な正規表現を使用することで、結果をマージあなたが同じ行に複数の一致を持つグローバルな正規表現をしなければならない数の量、:最初の数については

re.compile("\d+") 

Fまたは#数字

re.compile("# *?\d+") 

+番号

re.compile("+ *?\d+") 
関連する問題