使用Python

时间:2017-03-29 19:49:14

标签: python python-3.x

我有一堆python代码设置,可以根据某些搜索条件从证书列表中检索subjectDN。每个证书的所有信息都是逐行完成的。格式如下:

C =“ISO代码”,ST =“省”,L =“地区”,O =“组织名称”,OU =“组织单位”,CN =“证书名称”

我的一个文件的例子是:

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

我想将其转换为一个工作的CSV文件,通常看起来很简单,但其中一些行包含其他数据:

businessCategory =私人组织,juridictionCountry = US,C = US,ST = California,L = Oakland,O = Acme Ltd.,OU =网络服务,CN = www.acme.com

此附加数据会抛出所有列。

我想用这些数据做两件事。

  1. 我希望只有第一个示例中的字段显示在每个列的CSV文件中;所以C,ST,L,O,OU和CN(省略各种证书中的奇怪字段)。
  2. 我想从每个值中省略“C =”或“ST =”。
  3. 我尝试过使用CSV模块,但我只能将此数据格式化为与现在完全相同。我也尝试在python中使用re模块重写一些行,但我对re的表达式非常困惑。

    我的想法是读取输出文件中的每一行,然后为每一行包含一个for循环,以找出我需要的字段并重写它们。类似的东西:

    def rewrite()
        common_name = #here is where I would do a re command
        if #CN= x, is found (where x is the data I want):
            ofile.write("www.acme.com")
        organization = #here is where I would do a re command
        if #O= x, is found (where x is the data I want):
            ofile.write("Acme Ltd.")
    --snip--
        ofile.write("\n")
    

    基本上我会将输入文件中每一行的此函数运行到输出文件。类似的东西:

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

    这是一个很好的方法吗?还是有更简单的方法?有人可以帮我用正则表达式来做这件事吗?

1 个答案:

答案 0 :(得分:0)

好吧,如果您可以确定条目的顺序,您可以使用正则表达式提取数据,然后从中形成一个pandas数据帧:

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