2017-12-03 12 views
0

pythonでregex groupを使って行の一部だけを取得するには? 私は1行に1つのエントリのデータベースを持っていて、行の始めに月と日のデータに従ってそれをファイルに分割したいが、最初の21文字を含まない行だけを出力したい。ここ は、データベースの迅速なサンプルです:Pythonでregex groupを使って行の一部だけを取得するには?

01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M; 
01-01-1996-08:40:00| Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M; 
01-01-2001-01:30:00| Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M; 
01-02-1467-00:20:00| King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M; 
01-02-1746-09:00:00| Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M; 
01-02-1784-01:00:00| Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M; 

所望の出力ファイル01-01.zbs:

Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M; 
Dawid Kwiatkowski; 1.1.1996; 08:40; +01; Gorzów Wielkopolski,Poland; 52n44; 15e15; M; 
Liam Flockhart; 1.1.2001; 01:30; -08; San Diego,California; 32n43; 117w09; M; 

出力ファイル01-02.zbs:

King of Poland Sigismund I the Old; 2.1.1467; 00:20; +00:21:33; Kozienice,Poland; 51n35; 21e33; M; 
Duke of Rambouillet Louis Marie; 2.1.1746; 09:00; -00:03:41; Madrid,Spain; 40n24; 3w41; M; 
Duke of Saxe-Coburg and Gotha Ernst I; 2.1.1784; 01:00; +00:10:58; Coburg,Germany; 50n15; 10e58; M; 

私が使用しましたその年の毎日ごとにソートし、それに応じてファイルを分割することができます。グループを使用する方法、

re.search("^[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}:[0-9]{2}:[0-9]{2}| (.*)",line[0]) 
re.search("^.{21}(.*)",line[0]) 

しかし、\ 1:しかし、私はこれを行うために正規表現グループを使用しようとしていますので、このように、出力に各行の最初の21個の文字を望んでいません(*)。その部分だけを出力しますか? 正規表現でもこれを行う必要がありますか?ここで

は、全体のコードです:コードは、おそらくかなり間違っているので、私は、Pythonに非常に初心者です:

import re 
with open("database.txt") as f: 
    pstring='' #previous line string beginning 
    astring='' #actual line string beginning 
    try: 
     out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w") 
     for line in f: 
      astring = re.search("^[0-9]{2}-[0-9]{2}-",line[0]) 
      if not pstring = astring: 
       out.write(line) 
       pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0]) 
       if out: out.close() 
       out = open(re.search("^[0-9]{2}-[0-9]{2}",line[0]) + ".zbs", "w") 
      else: 
       pstring = re.search("^[0-9]{2}-[0-9]{2}-",line[0]) 
       out.write(line) 
    finally: 
     out.close() 

よろしく。

+0

希望する出力は何ですか? – Ajax1234

+1

同じ行に対して同じre.searchを繰り返し実行することがわかります。結果を変数に格納し、その変数を代わりに使用することを検討することもできます。 –

+1

最初のファイルは、withステートメントを使用して開きます。ただし、2番目のファイルでは、withステートメントは使用しません。したがって、ファイルを自分で閉じる必要があります。残念ながら、close()コマンドは失敗し、エラーメッセージは実際のエラーを記述しようとしていたメッセージをマスクします。 –

答えて

1

のは、ファイル内の単一の行を考えてみましょう:

line = "01-01-1989-06:30:00| Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M;" 

あなたがラインの最初の21個の文字を取り除きたい場合は、あなたは、単に次のようにスライスと呼ばれているものを使用することができます。

>>> print(line[21:]) 
Stefan Reinartz; 1.1.1989; 06:30; +01; Engelskirchen,Germany; 50n59; 7e24; M; 

(スライシングを経由して部分文字列を取得の詳細についてはthisサイトを見てください。)

を今、あなたは、このようなラインの部分を抽出する必要がある場合は、トンをあなたは本当に正規表現を利用することができます。例えば、日付の部分を取得するには、あなたが述べたように、あなたが使用することができ、次のように名前付きグループのパターン:

import re 
p = r"[^\;]+; (?P<day>[0-9]+)\.(?P<month>[0-9]+)\.(?P<year>[0-9]+)" 
m = re.match(p, line) 

マッチしたグループは、このようにアクセスすることができる。

>>> m.group("day") 
'1' 
>>> m.group("month") 
'1' 
>>> m.group("year") 
'1989' 

(もちろん、行の先頭から直接取り出して日付を取得することもできますが、これは名前付きグループの使用例を示しています)

+0

今は良くなっていますが、最初の5文字だけを読みたい場合はどうすればいいですか? – RyosanCiffer