Regex 数据帧的模式匹配与csv转换

Regex 数据帧的模式匹配与csv转换,regex,pandas,Regex,Pandas,我使用下面的代码来解析文本文件中的数据,该文本文件包含多个字段和数百个列名,我在通过read_csv进行处理时选择所需的字段,该代码运行良好,它仅与encoding='cp1252'一起工作。 我要查找的五个关键字段分别是['Hostname'、'IP Address'、'Aux Site'、'OS Version'、'Network Name'] 在模式部分,我使用了一个变量patt查找关键字/字符串,如“AIX | CentOS | RHEL | SunOS | SuSE | Ubuntu

我使用下面的代码来解析文本文件中的数据,该文本文件包含多个字段和数百个列名,我在通过read_csv进行处理时选择所需的字段,该代码运行良好,它仅与encoding='cp1252'一起工作。 我要查找的五个关键字段分别是
['Hostname'、'IP Address'、'Aux Site'、'OS Version'、'Network Name']

在模式部分,我使用了一个变量
patt
查找关键字/字符串,如
“AIX | CentOS | RHEL | SunOS | SuSE | Ubuntu | Fedora |?”
,我认为它不关心大小写的敏感性。 它被匹配到列
OS Version
中,但我正在使用litral
标记来匹配正在工作的
,但同时它也会得到
Windows 10???
,如果
OS Version
字段中有
,我只想要

其次,当它将
df2.转换为_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)
以下是用于查看的数据示例图像:

下面是同样的数据以文本格式再次复制的情况。 非常感谢您的帮助。

我建议您使用

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

patt=“(?s)AIX | CentOS | RHEL | SunOS | SuSE | Ubuntu | Ubuntu | Fedora |?”(?s)AIX | CentOS | RHEL | SuSE | Ubuntu SuSE | Ubuntu|(?@WiktorStribiżew,谢谢你的建议,请让我试试……这确实很棒。@WiktorStribiżew,正则表达式可以工作,但当我将df转换为csv数据列时,数据列没有正确对齐,这是我最近通过csv函数手动完成的。我不太明白,我是否应该发布我的解决方案?它有帮助吗?谢谢Wiktor的回答,接受了。
patt = "(?s)AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|(?<!\?)\?(?!\?)"