python查找并匹配精确字符串

2024-05-13 04:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将.csv文件中列中的字符串与定义的数据类型列表相匹配?在

数据类型列表为:

Datatype = ["M", "B", "E", "A", "DF", "DW", "DL", "DT", "XTEXT", "MDEDATA"]

我想使用与列匹配的数据类型在字典中查找值。在

什么有效

当我的代码在输入中找到类似DW1的内容时(参见下面的示例),它将DW:5写入输出文件,当它找到DT34时,它会写入DT:7。这个很好用。在

什么不起作用

但问题是,每当我的代码遇到XTEXT时,它首先匹配E: 2(因为E出现在XTEXT)中,然后匹配到下一行的XTEXT: 4105。因此,输出文件中对应的行包含2,而不是{}。{{14}与{cd13}相似。在

我尝试使用正则表达式从输入文件中的相关列中删除数字(这一行在上面的代码中被注释掉),如下所示:

^{pr2}$

但是当遇到X256DATA这样的字符串时,这会导致问题。在

另一个问题是,当前生成的输出文件在第一列中显示abc;DW1,在第二列中显示{},但我希望在第一列中显示{},在第二列显示{},在第三列显示{}!在

我怎样才能解决这些问题?感谢任何帮助。在


CSV示例

输入:

1 abc DW1  
2 uz5 XTEXT

电流输出:

1 abc DW1    5
2 uz5 XTEXT  4105

TXT示例

输入:

abc;DW1\n  
uz5;XTEXT\n

电流输出:

abc;DW1,5\n  
uz5;XTEXT,4105\n    

期望输出

abc;DW1;5\n  
uz5;XTEXT;4105\n

Tags: 文件csv字符串代码示例列表定义dt
3条回答

好的,下面是一个基于您的代码的解决方案,它适用于您的.txt文件的格式:

import csv

# Define data_type / dict1 / dict2:

data_type = [
    "M", "E", "B", "A", "DF", "DW", "DL", "DT", "PF", "PW", "PL", "PT",
    "XTEXT", "MDEDATA", "X8DATA", "X16DATA", "X32DATA", "X64DATA",
    "X128DATA", "X256DATA", "X512DATA", "X1024DATA", "X2048DATA",
    "X4096DATA", "X8912DATA"]

dict1 = {
    "M": 1, "E": 2, "A": 3, "DF": 4, "DW": 5, "DL": 6, "DT": 7, "PF": 8,
    "PW": 9, "B": 10, "PL": 11, "PT": 12, "XTEXT": 4105, "MDEDATA": 4110,
    "X8DATA": 10000, "X16DATA": 10001, "X32DATA": 10002, "X64DATA": 10003,
    "X128DATA": 10004, "X256DATA": 10005, "X512DATA": 10006,
    "X1024DATA": 10007, "X2048DATA": 10008, "X4096DATA": 10009,
    "X8912DATA": 10010}

dict2 = {
    "M": "B", "E": "B", "A": "B", "DF": ">f","PF": ">f", "DW": ">h",
    "PW": ">h", "DL": ">l", "PL": ">l", "DT": "String", "PT": "String",
    "B": "B", "XTEXT": "XTEXT", "MDEDATA": "MDEDATA", "X8DATA": "X8DATA",
    "X16DATA": "X16DATA", "X32DATA": "X32DATA", "X64DATA": "X64DATA",
    "X128DATA": "X128DATA", "X256DATA": "X256DATA", "X512DATA": "X512DATA",
    "X1024DATA": "X1024DATA", "X2048DATA": "X2048DATA",
    "X4096DATA": "X4096DATA", "X8912DATA": "X8912DATA"}

# Obtain writer for output file:

source = 'GSV.txt'
dest = open('GSV_copy.txt', 'w')

# Process data:

import re

source_lines = open(source).readlines()
for line in source_lines:
    x = line.split(';')[1]
    icon_lletter = ''
    icon_lnummer = 0
    python_letter = ''
    for t in data_type:
        if x.startswith(t): # Alternative using re: "if re.match(t, x)"
            icon_lletter = t
            break
    if (icon_lletter not in dict1):
        print "Entry (%s) in Dictionary1 is not available" % (icon_lletter)
    else:
        icon_lnummer = dict1[icon_lletter]
    if (icon_lletter not in dict2):
        print "Entry (%s) in Dictionary2 is not available" % (icon_lletter)
    else:
        python_letter = dict2[icon_lletter]
        print "Converted the GVR datatype to python datatype is %s : %s : %s" \
            % (icon_lletter, python_letter, icon_lnummer)
        # Write line to output file:
        dest.write(';'.join([line.strip('\n'), str(icon_lnummer) + '\n']))

dest.close()

请注意:

  • 有了这个解决方案,我试图解决您的问题,同时保持接近您的原始实现。实现目标的方法有很多种,可能更像Python式的/高效的/干燥的。

  • 由于输入和输出文件的列数不同,格式也不同,因此您最终会希望将代码转换为一个(一组)函数,该函数将不同的内容(要检查的文件类型和列)作为参数。


编辑:

在这个问题上,我发现dest中的输出有点混乱。(我之前还没到那么远:))我已经更改了代码,以产生您现在想要的精确输出。在


另一个编辑(基于评论中的讨论):

关于将输入文件中的数据类型与已定义的data_type列表相匹配的主题:如果输入文件中的DT总是在开头或结尾使用您不想考虑的数字,则可以使用

^{pr2}$

或者

re.sub('[0-9]+$', '', x)

移除它们。在

普通字典查找与键完全匹配。如果你得到了多个匹配,你就在做别的事情。在

>>> dict1 = {"M":1, "E":2, "A":3, "DF":4, "DW":5, "DL":6, "DT":7, "B":10, "XTEXT":4105, "MDEDATA":4110}
>>> dict1["XTEXT"]
4105

现在从更新后的问题中我看到您并没有真正寻找完全匹配,因为文件中的DW1应该与Datatype中的DW匹配。如果要检查字符串的开头是否匹配,请使用str.startswith

^{pr2}$

请注意,您必须在M之前检查MDEDATA,以避免错误匹配。一般来说,先检查较长的匹配项,再检查较短的匹配项。在

正如itsjeyd建议的那样

re.sub('^[0-9]+', '', x) or re.sub('[0-9]+$', '', x) does the trick!

相关问题 更多 >