3

テーブルのレコードのフィールドの1つに文字列の形式で価格が含まれているdbを取得しました。文字列自体は大したことではありませんが、価格はまったくフォーマットされていません。

$12,000.50
$3.50
From $3.50 to $12,000.50

私が取得しようとしているものは次のとおりです。

12000.50
3.50
3.50

すべての「$」と「,」を取り除き、2 の最初の桁だけを残します

私はこのコードを作成しましたが、最初から例までは機能しますが、最後の例では失敗します(sqlite構文エラー-明らかに両方の数字が表示されます)

コードは次のとおりです。

for every_line:
           found=re.findall(r"\d.\.?",every_line[9])
           db_cursor.execute("UPDATE MAINTABLE SET Price="+"".join(found)+" WHERE Id="+str(every_line[0]))
db_connection.commit()

ここで、every_line[0] はインデックス フィールド、[9] は価格フィールドです。

どうすればより効率的に (正規表現の有無にかかわらず)、よりシンプルで、より普遍的なものにできますか?

前もって感謝します

4

2 に答える 2

1

','を空の文字列 ( ) に置き換えてから、次の''単純な を適用しますregex

>>> r = re.compile("\$(\d+.\d+)")

>>> r.search(strs.replace(',','')).group(1)
'12000.50'

>>> strs = '$3.50'
>>> r.search(strs.replace(',','')).group(1)
'3.50'

>>> strs = 'From $3.50 to $12,000.50'
>>> r.search(strs.replace(',','')).group(1)
'3.50'
于 2013-06-15T09:08:56.007 に答える
0

あなたの問題は、findall一致するすべてのテキストフラグメントを取得することです。ただし、最後の例には一致するフラグメントが 2 つあります。

>>> re.findall(r"\d.\.?", "From $3.50 tp $12,000.50" )
['3.', '50', '12', '00', '0.', '50']

それらを結合しても、数値と見なされるものは生成されません。

>>> "".join(['3.', '50', '12', '00', '0.', '50'])
'3.5012000.50'

すべての価格が 1 から始まり、最初の$価格のみに関心があると仮定すると、次のようなものがよいかもしれません。

>>> import re
>>> import string

>>> p = [ "$12,000.50", "$3.50", "From $3.50 tp $12,000.50", "$12,000" ]
>>> [re.search(r"\$(\d+(\.\d+)?)", string.replace(price,",","")).group(0) for price in p]
['$12000.50', '$3.50', '$3.50', '$12000']

>>> [re.search(r"\$(\d+(\.\d+)?)", string.replace(price,",","")).group(1) for price in p]
['12000.50', '3.50', '3.50', '12000']

お気づきのとおり、これはセントなしで適切に価格を処理します。

于 2013-06-15T09:02:40.523 に答える