2012-04-23 2 views
2

私はこの1つを熱心にグーグルで見つけましたが、実際にはそれを絞り込むことはできません。私は値のCSVファイルを解釈しようとしています。しかし、私は1000以上の値、すなわち引用やコンマを含む値によって罰せられています。私はちょうど列から数値のリストを作成するcsvリーダーを使用して周りに取得しているが、その後、コンマを後で選ぶ必要があります。Pythonの正規表現を使用してカンマを数字でクリーンアップ

純粋に学術的な理由から、正規表現で文字列を編集するより良い方法はありますか? 08/09/2010,"25,132","2,909",650から08/09/2010,25132,2909,650になります。

(あなたがVimのにしている場合は、基本的に私はこれでPythonを入れたい: :1,$s/"\([0-9]*\),\([0-9]*\)"/\1\2/g:D)

+1

引用符で囲む必要がないように、コンマを値の一部として含む特定のフィールドをクリーンアップしたいのですか?その場合、あなたの例は間違っています。 '25,132"を '25132'に' '2,909" 'を' 2,909'に変換します。 – beerbajay

+0

これは非常に混乱しています。 –

+0

ああ、おっぱい!私の悪い、私はそれらをすべて後で整数に変換したいので、純粋な数字の文字列が必要になります。 – Oldtowner

答えて

1

私はコンマは数字のみで表示されると仮定して、あなたが探しているものだと思う、とすることをこれらのエントリは常に引用されます:

import re 

def remove_commas(mystring): 
    return re.sub(r'"(\d+?),(\d+?)"', r'\1\2', mystring) 

UPDATE:

: は、以下の任意の長さの数字のために働く必要があり、次の cdarkeのコメントを追加します
import re 

def remove_commas_and_quotes(mystring): 
    return re.sub(r'","|",|"', ',', re.sub(r'(?:(\d+?),)',r'\1',mystring)) 
+1

999,999 ... –

+0

より大きい数値では機能していません。あなたがここで探しているのは、あなたがそれを投げることができるように、多くの数字/カンマグループを扱うことができる再帰的な正規表現です。私はそれについて数分間考えなければならない。 – jdotjdot

+0

r '(?:(\ d +?))、) '、r' \ 1 ' – cdarke

0

Pythonは "再"、正規表現モジュールがあります。

>>> s = 'some_long_string,"12,345",more_string,"56,6789",and_some_more' 
>>> left_part,quote_mark,right_part = s.partition(") 
>>> right_part 
'12,345",more_string,"56,6789",and_some_more' 
>>> number,quote_mark,remainder = right_part.partition(") 
'12,345' 

http://docs.python.org/library/re.html

ただし、この場合には、あなたは "パーティション" 機能を使用して検討する必要がありますstring.partition( "character")は、文字列を3つの部分に分割します。最初の "文字"、 "文字"自体の左側にあるもの、右側のものです。

+0

私が望んでいたものではありませんでしたが、間違いなく興味深い解決策でしたが、私は一致することを望んでいました(訳注:正規表現を文字列要素に置き換え、要素を置き換えます。 – Oldtowner

2

第1段階の解析にはcsvモジュールを使用し、結果を数値に変換できるかどうかを確認するためにのみ正規表現を使用します。

import csv, re 
num_re = re.compile('^[0-9]+[0-9,]+$') 
for row in csv.reader(open('input_file.csv')): 
    for el_num in len(row): 
    if num_re.match(row[el_num]): 
     row[el_num] = row[el_num].replace(',', '') 

...それはおそらく、すべての正規表現を使用しないように速くなるだろうが:

for row in ([item.replace(',', '') for item in row] 
      for row in csv.reader(open('input_file.csv'))): 
    do_something_with_your(row) 
+0

@RobIはい、そうです - CSVモジュールは引用符を取り除くので、 '' 12,345''ではなく '12,345'のみを返します。 –

+0

私はこの答えが一番好きです(私の-1を削除することはできません)しかし、私はそこに最後の行がある必要があると思います: '' row [el_num] = int(row [el_num] .replace( '、'、 '') '。単にifステートメントを完全に取り除く;私はそれだけで明快さを追加すると言うinyパフォーマンスヒット(存在する場合)。 –

+0

@RobIオハイオ州、良いキャッチ - 提案ごとに最後の行をパッチしました。ところで、私は-1票が実際に引っ込め可能であることをかなり確信しています。 –

0

をここで任意の長さの数字からカンマを削除するための簡単な正規表現です:

re.sub(r'(\d+),?([\d+]?)',r'\1\2',mystring) 
関連する問題