2017-03-29 4 views
1

いくつかの検索基準に基づいて証明書のリストからsubjectDNを取得するPythonコードのセットがあります。各証明書のすべての情報は、行単位で行われます。 OU = "組織単位"、CN = "証明書の名前"は、次のとおりです。SubjectDNデータの再フォーマットPythonを使用して

C = "ISOコード"、ST = "地域"、L = "地域"、O =

私のファイルの一つの例は次のようになります。

C = US、ST =カリフォルニア州、L =オークランド、O = Acmeの(株)、OU = Webサービス、CN = www.acme.com

C = US、ST =カリフォルニア、L =オークランド、O = Acme Ltd.、OU = Webサービス、CN = portal.acme.com

C = US、ST = California、L = Oakland、O = Acme Ltd.、OU = Web Services、CN = sar

はbusinessCategory =民間組織、juridictionCountry = US、C =:私は通常、非常に簡単に見えるが、これらの行の一部は、追加データを含むことになり、作業CSVファイルにこれを変換したいdine.acme.com

米国、ST =カリフォルニア州、L =オークランド、O = Acme Ltd.、OU =ウェブサービス、CN = www.acme.com

この追加データは、すべての列をライン外に投げる。

私はこのデータで2つのことをしたいと思います。

  1. 最初の例のフィールドのみを各列のCSVファイルに表示したいと思います。 C、ST、L、O、OU、CN(さまざまな証明書にある奇妙なフィールドは省略しています)。
  2. 各値から "C ="または "ST ="を省略したいと思います。

私はCSVモジュールを使用しようとしましたが、このデータは今のところまったく同じ形式でしか取得できません。私はまた、Python内のreモジュールを使用していくつかの行を書き直そうとしましたが、reとの表現には非常に混乱しています。

私が持っていたアイデアは、私が持っている出力ファイルの各行を読み込み、必要なフィールドを探して書き直すために各行にforループを追加することでした。次のようなものがあります。

本質的には、入力ファイルの各行に対してこの機能を実行します。次のようなものがあります:

with open(...) as f: 
    for line in f: 
     rewrite() 

これは良い方法ですか、それとも簡単な方法ですか?誰かがこれを行う正規表現で私を助けることができますか?

答えて

0

さて、あなたはエントリーのについて確認することができた場合、あなたは正規表現を使用してデータを抽出し、その後それからパンダのデータフレームを形成することができる:

import re, pandas as pd 

string = """ 
C=US, ST=California, L=Oakland, O=Acme Ltd., OU=Web Services, CN=www.acme.com 

C=US, ST=California, L=Oakland, O=Acme Ltd., OU=Web Services, CN=portal.acme.com 

C=US, ST=California, L=Oakland, O=Acme Ltd., OU=Web Services, CN=sardine.acme.com 

businessCategory=Private Organization, juridictionCountry=US, C=US, ST=California, L=Oakland, O=Acme Ltd., OU=Web Services, CN=www.acme.com 
""" 

rx = re.compile(r'[A-Z]{1,2}=([^\n\r,]+)') 

data = [(rx.findall(line)) for line in string.split("\n") if line] 
df = pd.DataFrame.from_records(data, columns = ['CountryName', 'StateOrProvinceName', 'Locality', 'Organization', 'OrganizationalUnit', 'CommonName']) 
print(df) 

...どの

CountryName StateOrProvinceName Locality Organization OrganizationalUnit \ 
0   US   California Oakland Acme Ltd.  Web Services 
1   US   California Oakland Acme Ltd.  Web Services 
2   US   California Oakland Acme Ltd.  Web Services 
3   US   California Oakland Acme Ltd.  Web Services 

     CommonName 
0  www.acme.com 
1 portal.acme.com 
2 sardine.acme.com 
3  www.acme.com 
+0

私はそれを試しましたが、奇妙なエントリのために失敗しました。今はいつも、私が望むすべての価値を持っているだけでなく、いくつかのエクストラを持っている行があります。あなたのコードをしようとすると、私は次のようになる:AssertionError:6列が渡され、渡されたデータには8列がある。あなたの提案を試みる前に、これらのエントリを探して削除する方法はありますか? "CN = some_text"を完全に削除する方法(CN =でない場合のみ、 "businessCategory = some_text"などのフィールドになります) – Eddi

+0

私はちょっと乱暴にしました。私がしたことです: 'result = open(" string.txt "、" r ")' 'file_read = result.read()' 'rm = re.sub(r '[\ w] {6,19} =([^。\、] +) '、 ""、file_read) ' 私のサブの唯一の問題は、カンマがまだ含まれているため、レコードは、C =データ、L =データのように見えます。等。 – Eddi

関連する問題