熊猫模式匹配和dataFrame的csv转换

时间:2019-04-24 11:02:16

标签: regex pandas

我有以下代码,用于从包含多个字段和数百个列名称的文本文件中解析我的数据,在这里我通过read_csv选择熊猫处理时所需的字段,效果很好,它仅适用于encoding ='cp1252'。 我要寻找的五个关键字段分别为['Hostname', 'IP Address', 'Aux Site', 'OS Version', 'Network Name']

在模式部分中,我正在使用变量patt,我正在寻找"AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|\?"的关键字/字符串,我相信它并不关心大小写。 它与列OS Version匹配,但我使用的是对角线?来匹配正在工作的?,但同时它也得到了Windows 10 ???我只希望?OS Version字段中。

第二,当其转换df2.to_csv时,列没有定界,而是变成一个列,后来我手动定界,我们如何确保每个字段都被正确处理为CSV文件。

#!/python/v3.6.1/bin/python3
import pandas as pd
##### Python pandas, widen output display to see more columns. ####
pd.set_option('display.height', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('expand_frame_repr', True)
##################### END OF THE Display Settings ###################
patt = "AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|\?"
col_names = ['Hostname', 'IP Address', 'Aux Site', 'CPU Model', 'CDN Version', 'OS Version', 'Kernel Version', 'LDAP Profile', 'Network Name']
df1 = pd.read_csv('/home/karn/plura/Test/Python_Panda/host.txt', delimiter = "\t", usecols=col_names, encoding='cp1252',  dtype='unicode')
df2 = df1[df1['OS Version'].str.contains(patt,  na=False)][['Hostname', 'IP Address', 'Aux Site', 'OS Version', 'Network Name']]
df2['Hostname'] = df2['Hostname'].str.replace("*", "")
df2.to_csv("HostList_from_Surveys.csv", sep='\t', encoding='utf-8', index=False)

下面是用于视图的数据样本图像:

enter image description here

下面还是相同的文本格式数据,以防重现。

Hostname    IP Address  Aux Site    OS Version  Network Name
host01      192.168.1.1   yoko  RHEL 5.5    CISCO
host02      192.168.1.2   chelmsford    AIX 6.1 
host03      192.168.1.3   sanjose   RHEL 5.5    
host04      192.168.1.4   rosh  CentOS 6.8  CISCO
host05      192.168.1.5   noida3    CentOS 5.10 CISCO
host06      192.168.1.6   rosh  RHEL 6.5    CISCO
host07      192.168.1.7   noida3    RHEL 6.5    CISCO
host08      192.168.1.8   san jose  RHEL 6.5    CISCO
host09      192.168.1.9   noida3    RHEL 5.5    
host10      192.168.1.10      sophia    RHEL 5.5    AVAYA
host11      192.168.1.11      sanjose   RHEL 5.5    AVAYA
host12      192.168.1.12      sanjose   RHEL 5.3    AVAYA
host13      192.168.1.13      sanjose   RHEL 5.8    AVAYA
host14  192.168.1.14      sanjose   Ubuntu 14.04.1  

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议您使用

patt = "(?s)AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|(?<!\?)\?(?!\?)"

此模式匹配

  • (?s)-等价的re.DOTALL内联选项,使.匹配换行符
  • AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora-替代子字符串之一
  • |-或
  • (?<!\?)\?(?!\?)-不带其他问号的问号。