【问题标题】:python re.split strings and match them to dictionarypython re.split 字符串并将它们与字典匹配
【发布时间】:2017-05-09 12:44:49
【问题描述】:

我有一些数据文件名已经形成如下形式的字符串:

str = ('6m5.dat','10ext.dat','3m10.dat','3int.dat')

我想从中提取字符串“int”、“ext”、“m5”或“m10”,以了解我正在处理哪些数据。我看到它应该可以使用正则表达式,它在开头考虑未知数量的数字,最后考虑“.dat”。有人可以帮忙吗?

之后我需要将字符串与数字列表相匹配,以将我的值乘以:

extblade = 5.44852e-5
intblade = 5.44852e-5
m3blade = 1.812e-5
m5blade = 2.25e-5
m10blade = 6e-5

例如当字符串匹配 'int' 时,它应该设置 x = 5.44852e-5。

【问题讨论】:

    标签: python regex string python-2.7


    【解决方案1】:

    您可以使用以下模式

    '\d+(\w+\d*)'
    

    为了匹配字符串,首先我将这些值添加到dict

    d = {'extblade' : 5.44852e-5,
         'intblade' : 5.44852e-5,
         'm3blade' : 1.812e-5,
         'm5blade' : 2.25e-5,
         'm10blade' : 6e-5}
    

    所以要使用你的正则表达式模式

    >>> [re.match('\d+(\w+\d*)', i).group(1) for i in s]
    ['m5', 'ext', 'm10', 'int']
    

    然后从你的dict读取相应的值

    >>> [d[re.match('\d+(\w+\d*)', i).group(1)+'blade'] for i in s]
    [2.25e-05, 5.44852e-05, 6e-05, 5.44852e-05]
    

    【讨论】:

    • 比我的回答好。
    • 他没有提到这将是文件的格式。只是它们将包含单词 int、ext 等......
    • 这个解决方案效果很好。谢谢。只是出于好奇:'.group(1)' 有什么影响?我没有完全看到它在代码中是如何工作的。
    • re.match 返回一个match object,因此您可以通过拉出组来获取实际匹配的字符串。
    【解决方案2】:

    由于您没有明确定义文件的格式,看来唯一正确的解决方案是使用以下模式:

    regexp = r"((int)|(ext)|(m3)|(m5)|(m10))"
    

    然后将匹配的文本匹配到一个字典中的值:

    f = '6m5.dat','10ext.dat','3m10.dat','3int.dat'
    
    d = {'ext' : 5.44852e-5,
         'int' : 5.44852e-5,
         'm3' : 1.812e-5,
         'm5' : 2.25e-5,
         'm10' : 6e-5,
        }
    
    import re
    rx = re.compile(regexp)
    result = [ d[m.group(0)] if m else None for m in (rx.search(s) for s in f)]
    

    输出

    [2.25e-05, 5.44852e-05, 6e-05, 5.44852e-05]
    

    尝试对文件名使用特定模式可能会产生您提到的刀片中未定义的未知匹配项。

    【讨论】:

    • 正如我所写:我已经将它们作为字符串,所以这只是一个字符串匹配。因此我没有指定文件(顺便说一句,它们是 .txt 文件)。
    • 这比字符串匹配稍微好一点,因为它是一次性完成的,而不是每个字符串的多次遍历。您可以编辑您的帖子以显示确切的输入吗?无论如何,它与任何其他正则表达式解决方案一样好(性能方面)。
    • 不确定输入的确切含义?我同意您的解决方案在计算上可能更快的事实。我的输入是一个字符串列表(请参阅帖子中的“str”和我的赋值列表,我也将其放在帖子中)。我分配的值的字典绝对是我的值的更优雅的输入形式。文件名以字符串形式存在,因为我在代码的不同部分处理文件内容。
    • 好的。我可能误解了你的第一条评论。请注意,如果文件名为test4-m5d.dat,则接受的答案将不起作用。如果文件名不包含任何可接受的类型,则会崩溃。
    • 嗯好的,现在我明白了。实际上完整的文件名是“20170506_5int.dat”。但是,当我之前在下划线处拆分它们以提取日期时,我确信只有最后一部分留给我处理。可能有一种更优雅的解决方案可以一次提取所有值(如日期、文件编号和刀片类型)。但由于我只处理几百个文件,我并不真正关心这里的计算能力。您的解决方案也能解决这些问题,并且可能优于我实际需要的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多