2016-07-10 5 views
3

こんにちは、世界! 私は正規表現に問題があります。私は私に(例えば)これらの情報を与えること(イタリアの列車を検索するための)HTTP APIを使用しています:Python正規表現ですか?私はトラブルに陥っています

10911 - SESTO S. GIOVANNI|10911-S01325 

フォーマット:

TRAIN_NUMBER - STATION|TRAIN_NUMBER - STATION_CODE 

を少数の要求すべて私ので、それは、大丈夫ですがあったまで1つの情報 "S01325"だけが必要です。しかしユーザーが成長し始めたとき、私は同じ番号の列車が2つあるかもしれないことを発見しました。例えば、電車612が2 numerationsを持つことができ、実際にはAPIが私を与える:

612 - TARANTO|612-S11465 
612 - ASSO|612-N00079 

(urllib.requestモジュールを使用する)とき、私はこれを読んしようと、私が手:

b'612 - TARANTO|612-S11465\n612 - ASSO|612-N00079\n' 

I私は本当のREGEXを、使用する必要があります

A = ['612 - TARANTO', '612 - ASSO'] #First regex expression 
B = ['S11465', 'N00079'] #Second regex expression 

:2つのリストの変数を持っている必要がありますか?私は決してREGEXを使用しなかったので、私は何をすべきか分からない。 GoogleとWiki/docsで検索しました。しかし、私はこの問題の解決策を見いださなかった(404)。もちろん、正規表現式は、すべてのケースのための作品、例えば必要があります。

b'2097 - MILANO CENTRALE|2097-S01700\n' 

は私を与える:

A = ['2097 - MILANO CENTRALE'] 
B = ['S01700'] 

もう一つの例:

b'123 - ROMA TERMINI|123-S01358\n123 - TREVIGLIO|123-S01703\n' 

は私を与える:

A = ['123 - ROMA TERMINI', '123 - TREVIGLIO'] 
B = ['S01358','S01703'] 

をありがとう、本当にありがとうアディング。私は明らかに希望します。 は良い一日を、 マルコ P.S:Link to the italian docs

+0

はあなたが正規表現式を作成しようとしたことがありますか?あなたの質問に追加してください、それは簡単に助けることができます – Barnabus

+0

APIは何ですか?私はもっ​​と便利なフォーマットでデータを得ることができるというのが良いと思います。 –

+0

@PadraicCunninghamこれは働く唯一のAPIです。はい、私はそれが嫌いです。 – MarcoBuster

答えて

4

実際には正規表現は必要ありません。あなたはでもそれを使うことができます。あなたの情報ではなく、単純なパターンがあります:

<Train number> - <city>|<Train number>-<identifier> 

それでは、あなたがそう

>>> '123 - ROMA TERMINI|123-S01358'.split('|', 1) 
['123 - ROMA TERMINI', '123-S01358'] 

をすれば、今あなたが何をしたいの最初の部分を持っている何が起こるか見てみましょう。第二部は、その後、同様のものを使用して固定することができ、あなたは

>>> '123-S01358'.split('-', 1)[-1] 
'S01358' 

を行うことができますのは、

>>> '123-S01358'.split('-', 1) 
['123', 'S01358'] 

を見てみましょうとすれば完了です!

これらをすべて組み合わせると、回答が得られます。

2

私はREGEXを使用しなければならない、本当?

私はもっと良い解決策は、各行をトークンに解析し、それらを分かりやすい変数に割り当てることです。文字列プリミティブと正規表現についてはあまり解けない解決策が必要です。オブジェクトとカプセル化の詳細。

私は列車を簡単に検索し、その応答をJSONオブジェクトとして返すことができるREST APIを設計したいと思います。

0

まず、convert your bytearrays to str objectsが必要です。あなたが提供されている例では

examples = [ 
    b'2097 - MILANO CENTRALE|2097-S01700\n', 
    b'123 - ROMA TERMINI|123-S01358\n', 
    b'123 - TREVIGLIO|123-S01703\n' 
] 

その形式を想定するとは、次のとおりです。

[TRAIN_NAME]|[TRAIN_NAME_REPEATED]-[TRAIN_NUMBER]\n 

私たちはどんな正規表現を必要としない、我々は単に区切り文字によってエントリを分割することができます:

for example_bytes in examples: 
    example = example_bytes.decode("utf-8").split("|") 
    # example = ['2097 - MILANO CENTRALE', '2097-S01700\n'] 

    train_name = example[0] 
    # train_name = '2097 - MILANO CENTRALE' 

    train_number = example[1].split("-")[1] 
    # train_number = 'S01358' 

    A.append(train_name) 
    B.append(train_number.rstrip()) 

次に結果を確認してください:

print(A) 
# ['2097 - MILANO CENTRALE', '123 - ROMA TERMINI', '123 - TREVIGLIO'] 
print(B) 
# ['S01700', 'S01358', 'S01703'] 

エントリを繰り返すことができないようにしたい場合は、リストの代わりにsetsを使用することをおすすめします。

あなたはそれが内のエントリを提供フォーマットに依存して、APIのドキュメントを参照してください

0

をあなたが実際にあなたが* Trenoのために、正しいポストを作るJSON形式で必要なデータを得ることができます - 。のコードを使用してスタジオーネ*をロメッタMESSINESE

from pprint import pprint as pp 
import requests 
import datetime 

station = "S12049" 
dt = datetime.datetime.utcnow() 
arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/arrivi/{station}/{iso}" 
with requests.Session() as s: 
    r = s.get(departure.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)"))) 
    pp(r.json()) 

と出発:

arrival = "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/partenze/{station}/{iso}" 
with requests.Session() as s: 
    r = s.get(arrival.format(station=station, iso=dt.strftime("%a %b %d %Y %H:%M:%S GMT+000 (UTC)"))) 
    pp(r.json()) 
+0

Nope。これは駅の到着です。列車の情報が必要です。このためには、station_of_departure_idとtrain_numberが必要です。上記のtrain_numberとメソッドを使用して、私は出発駅のIDを持つことができます。 – MarcoBuster

+0

@MarcoBuster、これは一例です。データがjson形式であるすべてのデータがajax要求を使用して要求されると、すべてのデータを同じ方法で取得できます。列車に乗るためにあなたが使っていたURLは何ですか? –

+0

@MarcoBuster、あなたはページに表示されるすべての情報とjson形式の情報を含む到着と出発の両方を追加しました –

関連する問題