【问题标题】:PYTHON: Multiple Substitutions Using Regular ExpressionsPYTHON:使用正则表达式的多个替换
【发布时间】:2016-06-20 07:46:45
【问题描述】:

我有来自 db 类型的列表:

[[63], [426], [255], [167], [648], [364, 194], [686, 14]]  

我想将这些转换为:

63 -1 426 -1 255 -1 167 -1 648 -1 364 194 -1 686 14 -1 -2  and newline

即,如果多个元素使用“空格”和主列表中的元素使用“-1”并且最后必须存在“-2”和换行符,则在内部列表中分隔。
结果条目必须是数字。
任何想法(最好使用正则表达式)? 谢谢!

【问题讨论】:

  • 你到底为什么要为此使用正则表达式?
  • 似乎直接编码而不是正则表达式更容易。
  • 感谢您的反馈。输入来自另一个模块,因此无法控制初始创建。因此,只有“替代”类型的解决方案是可接受的。这就是为什么一开始我的想法是基于正则表达式的。现在,如果您可以建议,其他人也在上述限制范围内,他们非常欢迎!但我不明白“反对”的投票依据……
  • 不提供任何自己的努力通常是一个不受欢迎的磁铁。
  • 谢谢@IljaEverilä。顺便说一句,即使有帮助,您的解决方案也不能解决问题的完整性。假设例如:array = [[63], [426], [255], [167], [648], [364, 194], [686, [7, 77, 777], 14]] 那么,你的解决方案不起作用。

标签: python regex string


【解决方案1】:

采取“客户永远是对的”的方法,尽管解决问题的方法是错误,但我们可以通过正则表达式和字符串操作来做一些事情。要处理任意列表深度,您还需要包含您最喜欢的 flatten 例程实现:

import re

def flatten(array):
    new_array = []

    for element in array:
        if isinstance(element, int):
            new_array.append(element)
        else:
            new_array.extend(flatten(element))

    return new_array

array = [[63], [426], [255], [167], [648], [364, 194], [686, [7, 77, 777], 14]]

string = re.sub(r'[,\[]', '', str(list(map(flatten, array)))).replace('] ', ' -1 ').replace(']]', ' -1 -2\n')

print(string, end='')

产生:

63 -1 426 -1 255 -1 167 -1 648 -1 364 194 -1 686 7 77 777 14 -1 -2

【讨论】:

    【解决方案2】:

    你可以试试这个:

    array = [[63], [426], [255], [167], [648], [364, 194], [686, 14]]
    
    out = ''
    
    for group in array:
        for elt in group:
            out += str(elt) + ' '
    
        out += '-1 '
    
    out += '-2 \n'
    
    print(out)
    

    哪些输出:

    63 -1 426 -1 255 -1 167 -1 648 -1 364 194 -1 686 14 -1 -2 [newline]
    

    您不需要在这里使用正则表达式,这甚至是个坏主意,因为您正在处理列表。

    希望对您有所帮助。

    【讨论】:

    • 这不处理 OP 的第二个示例(在他的 cmets 中添加),在最终结果中留下括号,而不仅仅是数字,“... 686 [7, 77, 777] 14 。 ..”。
    【解决方案3】:

    更新:处理嵌套列表的解决方案:

    final_list = []
    my_list = [[63], [426], [255], [167], [648], [364, 194], [686, [7, 77, 777], 14]]
    
    def recursive_convert(item):
        if type(item) is list:
            for i in item:
                recursive_convert(i)
        else:
            final_list.append(item)
    
    for sublist in my_list:
        recursive_convert(sublist)
        final_list.append(-1)
    
    final_list.append(-2)
    final_list.append('\n')
    
    t = ' '.join(map(str, final_list))
    print(t)
    

    输出:

    ? xclip -o > k2.py                                                                                                                                                         
    ? python3 k2.py     
    63 -1 426 -1 255 -1 167 -1 648 -1 364 194 -1 686 7 77 777 14 -1 -2 \n
    

    在嵌套子列表之前和之后没有 -1,因为 OP 说他希望插入 -1 只是为了展示“主列表”的中断。


    没有嵌套列表的解决方案:

    final_list = []
    my_list = [[63], [426], [255], [167], [648], [364, 194], [686, 14]]
    
    for sublist in my_list:
        for item in sublist:
            final_list.append(item)
        final_list.append(-1)
    
    final_list += [-2, '\n']
    ' '.join(map(str, final_list))
    

    输出:

    63 -1 426 -1 255 -1 167 -1 648 -1 364 194 -1 686 14 -1 -2 \n
    

    【讨论】:

    • @cdlane 修复了处理嵌套列表的代码。谢谢你指出:)
    • 好像多了一个-1,一会儿会修复。
    • 你能再试一次吗:)
    猜你喜欢
    • 2012-02-16
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2019-05-31
    • 2012-06-17
    相关资源
    最近更新 更多