2017-12-05 10 views
0

私は、携帯電話からSMSを読み込み、いくつかの正規表現のパターンに基づいて情報を抽出するPythonを使用して、簡単なアカウントマネージャのアプリケーションを自分で作成しようとしています。Pythonでregexから1つの文字列を抽出するには?

私は複雑な正規表現パターンを書いてhttps://pythex.org/でテストしました。 例:私はstr.extract()メソッドではなく、単一の結果を取得を使用してPythonで同じことをしようとすると、

Text: 1.00 is debited from ******1234 for food 

Pattern: (account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*) 

Result: from ******1234 

しかし、私は、各グループの列を持つデータフレームを取得しています。上記のメッセージのためのPythonコードの

all_sms=pd.read_csv("all_sms.csv") 

pattern = '(account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*)' 

test = all_sms.extract(pattern, expand = False) 

出力:

Pythonのコードは次のようになります

0   from 
1    
2   NaN 
3   NaN 
4   NaN 
5  ******1234 
6   1234 
7   1234 
8    
9    
10    

私は、Pythonに非常に新しいですし、実地体験で学ぼうと、誰かが私がどこでこれに間違っているのかを指摘できれば本当に役に立ちますか?

+2

各アンエスケープされた '(' .')の後ろに冗長なキャプチャグループを削除 –

+0

これは特定の言語についての言語タグの使用を検討します – doctorlove

答えて

2

正規表現のパターンに入る前に、 パンダを使用する理由を理解する必要があります。パンダはデータ分析に適しています(あなたの問題に適しています) しかし、ここでは過度のようです。

初心者の私のアドバイスしている場合は、純粋なのpythonに固執するためではなく が複雑であるが、パンダのpython標準ライブラリを知ることが 長期的にお手伝いをしますので。あなたが今、基本を飛ばすなら、これは長期的にあなたを傷つけるかもしれません。

あなたは、私が 次のように進行する(パンダなし)のpython3を使用しようとしている考える:

# Needed imports from standard library. 
import csv 
import re 

# Declare the constants of my tiny program. 
PATTERN = '(account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*)' 
COMPILED_REGEX = re.compile(PATTERN) 

# This list will store the matched regex. 
found_regexes = list() 

# Do the necessary loading to enable searching for the regex. 
with open('mysmspath.csv', newline='') as csv_file: 
    csv_reader = csv.reader(csv_file, delimiter=' ', quotechar='"') 
    # Iterate over rows in your csv file. 
    for row in csv_reader: 
     match = COMPILED_REGEX.search(row) 
     if match: 
      found_regexes.append(row) 

print(found_regexes) 

が、必ずしもこれは、コピー&ペーストを使用して問題を解決しようとされるわけではありませんが、これはあなたの アイデアを与えるかもしれませんあなたの問題に対するより簡単なアプローチを提供します。

+0

詳細な回答と説明をありがとうございます。今は:) –

関連する問題