如何在 txt 文件中正则表达式这个 tetxt?

dis*_*231 0 python

我有一个这样的txt文件

DistinguishedName : CN=2,OU=2,OU=2,OU=3,OU=4,OU=5,OU=a,OU=1,OU=8,OU9,DC=a
                    ,DC=f
Enabled           : True
GivenName         : 
LastLogonDate     : 2021/7/8 AM 07:41:01
Name              : Ken
ObjectClass       : user
ObjectGUID        : r7h733-13
PasswordLastSet   : 2021/7/5 PM 10:25:08
SamAccountName    : hs875
SID               : t-1-7
Surname           : Ken
UserPrincipalName : 456
Whencreated       : 2018/1/14 PM 11:13:44


DistinguishedName : CN=1,OU=2,OU=2,OU=3,OU=4,OU=5,OU=6,OU=7,OU=8,OU9,DC=10
                    ,DC=11
Enabled           : True
GivenName         : 
LastLogonDate     : 2021/7/8 AM 07:41:01
Name              : eddie
ObjectClass       : user
ObjectGUID        : 67545-abc-98
PasswordLastSet   : 2021/7/5 PM 10:25:08
SamAccountName    : hs1234
SID               : S-1-5-21-3591743293-2469172948-1619552477-59604
Surname           : eddie
UserPrincipalName : 123
Whencreated       : 2018/1/14 PM 11:13:44
Run Code Online (Sandbox Code Playgroud)

我想通过正则表达式将此文本解析为数据框,列名在 : 之前,值在 : 之后,如下所示:

 DistinguishedName                                           Enabled  ... Whencreated   
 CN=2,OU=2,OU=2,OU=3,OU=4,OU=5,OU=a,OU=1,OU=8,OU9,DC=a,DC=f   True    ... 2018/1/14 PM 11:13:44
 CN=1,OU=2,OU=2,OU=3,OU=4,OU=5,OU=6,OU=7,OU=8,OU9,DC=10,DC=11 True    ... 2018/1/14 PM 11:13:44
                    
Run Code Online (Sandbox Code Playgroud)

我能怎么做?

Enz*_*nzo 5

您可以使用以下模式:

import re
pattern = re.compile(r'^(\w+)\s*: (.*)$')
Run Code Online (Sandbox Code Playgroud)

粗略地说,这意味着:从行 ( ^)的开头,获取第一个非空单词 ( (\w+)),忽略尾随的空格 ( \s*)、冒号 ( :) 和空格 ( ),并获取所有内容 ( (.*)) 直到行尾线 ( $)

然后,只需打开您的文件并将其解析为字典:

data = {}
with open('file.txt') as f:
    for line in f:
        match = pattern.match(line)
        if not match:
            # If this line does not match, add it to the previous added line
            data[col][-1] += line.strip()
            continue
    
        col = match.group(1)
        val = match.group(2)
        data.setdefault(col, []).append(val)
Run Code Online (Sandbox Code Playgroud)

的内容data

{'DistinguishedName': ['CN=2,OU=2,OU=2,OU=3,OU=4,OU=5,OU=a,OU=1,OU=8,OU9,DC=a,DC=f',
                       'CN=1,OU=2,OU=2,OU=3,OU=4,OU=5,OU=6,OU=7,OU=8,OU9,DC=10,DC=11'],
 'Enabled': ['True', 'True'],
 'GivenName': ['', ''],
 'LastLogonDate': ['2021/7/8 AM 07:41:01', '2021/7/8 AM 07:41:01'],
 'Name': ['Ken', 'eddie'],
 'ObjectClass': ['user', 'user'],
 'ObjectGUID': ['r7h733-13', '67545-abc-98'],
 'PasswordLastSet': ['2021/7/5 PM 10:25:08', '2021/7/5 PM 10:25:08'],
 'SID': ['t-1-7', 'S-1-5-21-3591743293-2469172948-1619552477-59604'],
 'SamAccountName': ['hs875', 'hs1234'],
 'Surname': ['Ken', 'eddie'],
 'UserPrincipalName': ['456', '123'],
 'Whencreated': ['2018/1/14 PM 11:13:44', '2018/1/14 PM 11:13:44']}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法将其转换为 DataFrame

import pandas as pd
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)