1

これが初心者の質問である場合は申し訳ありませんが、私はPythonの経験があまりなく、これを理解するのに実際に役立つ可能性があります. これに取り組むためのより良いプログラミング言語があれば、私はそれを聞くことにオープンです.

私は小さなプロジェクトに取り組んでおり、互いに異なる形式の 2 つのデータ ブロックがあります。それらはすべて CSV ファイルとして保存されたスプレッドシートであり、すべてのデータを手動で編集することなく、1 つのグループを他のグループと一致させたいと考えています。

私がする必要があるのは、CSV を調べて、次のように保存されたデータをフォーマットすることです。

10W

20E

15-16N

17-18S

このような形式に (それぞれの行をそれぞれの形式に):

10,W

20、E

,,15,16,N

,,17,18,S

スプレッドシートとして開いたときにコピーできるように

Pythonでファイルを文字列に変換することはできますが、数字-ハイフン-数字-文字形式を検索するために何かを適切に記述する方法がわかりません。

私が得ることができるどんな助けにも非常に感謝しています. ありがとう

4

3 に答える 3

1

これは、正規表現の良いユースケースのように思えます。行を個々の文字列に分割し、(を使用してs.strip())空白を削除すると、これらは機能するはずです(これらは基本的な方向[NESW]であると想定しています。その想定が正しくない場合は、別の方向に変更する必要があります)。

>>> import re
>>> re.findall('\A(\d+)([NESW])', '16N')
[('16', 'N')]
>>> re.findall('\A(\d+)([NESW])', '15-16N')
[]
>>> re.findall('\A(\d+)-(\d+)([NESW])', '15-16N')
[('15', '16', 'N')]
>>> re.findall('\A(\d+)-(\d+)([NESW])', '16N')
[]

最初の正規表現'\A(\d+)([NESW])'は、数字のシーケンスで始まり、大文字のN、E、S、またはWが続く文字列のみに一致します。2番目の正規表現は、数字のシーケンスで始まり、ハイフンが続き、別のシーケンスが続く文字列のみに一致します。数字の後に大文字のN、E、S、またはWが続きます。最初に一致させるように強制すると、これらの正規表現が長い文字列のサフィックスと一致しないようになります。

次に、次のようなことを行うことができます。

>>> vals = re.findall('\A(\d+)([NESW])', '16N')[0]
>>> ','.join(vals)
'16,N'
>>> vals = re.findall('(\d+)-(\d+)([NESW])', '15-16N')[0]
>>> ',,' + ','.join(vals)
',,15,16,N'
于 2012-06-01T20:05:49.773 に答える
1

これは、正規表現を使用するソリューション全体です。@senderle が私を打ち負かしたので、遠慮なく彼の回答にチェックを入れてください。reこれは、最初に自分のコードに頭を悩ませることがどれほど難しいかを知っているので、ここに追加しただけです。

import re

dash = re.compile('(\d{2})-(\d{2})([WENS])')
no_dash = re.compile( '(\d{2})([WENS])' )

raw = '''10W
20E
15-16N
17-18S'''
lines = raw.split('\n')

data = []

for l in lines:
    if '-' in l:
        match = re.search(dash, l).groups()
        data.append( ',,%s,%s,%s' % (match[0], match[1], match[2] ) )
    else:
        match = re.search(no_dash, l).groups()
        data.append( '%s,%s' % (match[0], match[1] ) )

print '\n'.join(data)
于 2012-06-01T20:15:13.890 に答える
0

あなたの場合、迅速な解決策には正規表現が含まれると思います

matchメソッドを使用して、指定された正規表現に一致するさまざまなトークンを抽出するか、splitメソッドを使用して文字列を区切り文字を指定してトークンに分割できます。

ただし、この場合、区切り文字は1文字になるため、クラスのsplitメソッドを使用できます。str

于 2012-06-01T20:03:52.517 に答える