【问题标题】:Regex analog for lists/sequences列表/序列的正则表达式模拟
【发布时间】:2012-08-13 15:01:34
【问题描述】:

我发现使用正则表达式我可以得到修改后的字符串,而不必显式循环原始字符串,这很酷——例如在 Python 中:

from re import sub
print sub(r'12', r'twelve', r'12 + 12 = 24')

打印

twelve + twelve = 24

一般列表有类似的东西吗?特别是,它如何在 Python 中使用将非常受欢迎,但在任何语言中这样的东西也很酷。

我可能有一个示例任务会得到一个类似的列表

[0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1]

将所有出现的0 , 1 替换为2,这样我就可以得到:

[0, 2, 1, 2, 2, 1, 2]

当然,在这种特殊情况下,我可以将列表转换为一串数字,然后使用正则表达式,但我希望可以使用一些模拟列表来代替。

【问题讨论】:

  • 没有这样的工具。很难定义模式,因为列表可能包含任何内容,而字符串仅由 1 字符字符串组成。但我喜欢这个主意

标签: python regex list


【解决方案1】:

对于这个单一的案例:

a = [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
b = []

while a:
    x = a.pop(0)
    if x == 0 and a and a[0] == 1:
        a.pop(0)
        b.append(2)
    else:
        b.append(x)

【讨论】:

    【解决方案2】:

    似乎没有用于列表操作的正则表达式模拟。 对于像您这样的一些简单情况,您可以这样做:

    1. 您可以将列表转换为str
    2. 使用 regex replace 根据您的要求替换元素。
    3. 使用 literal_eval 将修改后的字符串再次转换为列表。

    在这里工作:http://ideone.com/tgg3N

    from re import sub
    import ast
    
    myList = [0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
    listStr = str(myList)
    myNewStr = sub(r'0\s*,\s*1',r'2',listStr)
    myNewList = ast.literal_eval(myNewStr)
    print str(myNewList)
    

    但是,当您可以通过替换列表中的元素而不是对其字符串表示进行正则表达式替换来逻辑地执行列表上的所有操作时,这不是一个好方法。

    【讨论】:

    • 0,\s+1 是什么意思?和 0,1 一样吗?
    • @shantanuo \s 表示它们之间出现的任何空格。理想情况下,它应该是\s* 来处理一个或多个空格。我也编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2012-05-23
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多