解压名称

发布于 2024-09-26 05:14:11 字数 169 浏览 2 评论 0原文

解压缩数据名称的最简单方法是什么?

例如,将压缩形式: 更改

abc[3:0]

为解压形式:

abc[3]
abc[2]
abc[1]
abc[0]

优选 1 个衬垫 :)

what is the easiest way to decompress a data name?

For example, change compressed form:

abc[3:0]

into decompressed form:

abc[3]
abc[2]
abc[1]
abc[0]

preferable 1 liner :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

国粹 2024-10-03 05:14:11

在 Perl 中:

#!perl -w

use strict;
use 5.010;

my @abc = qw/ a b c d /;
say join( " ", reverse @abc[0..3] );

或者如果您希望将它们放入单独的变量中:

my( $abc3, $abc2, $abc1, $abc0 ) = reverse @abc[0..3];

编辑:根据您的说明:

my $str = "abc[3:0]";
$str =~ /(abc)\[(\d+):(\d+)\]/;
my $base = $1;
my $from = ( $2 < $3 ? $2 : $3 );
my $to = ( $2 > $3 ? $2 : $3 );
my @strs;
foreach my $num ( $from .. $to ) {
  push @strs, $base . '[' . $num . ']';
}

In Perl:

#!perl -w

use strict;
use 5.010;

my @abc = qw/ a b c d /;
say join( " ", reverse @abc[0..3] );

Or if you wanted them into separate variables:

my( $abc3, $abc2, $abc1, $abc0 ) = reverse @abc[0..3];

Edit: Per your clarification:

my $str = "abc[3:0]";
$str =~ /(abc)\[(\d+):(\d+)\]/;
my $base = $1;
my $from = ( $2 < $3 ? $2 : $3 );
my $to = ( $2 > $3 ? $2 : $3 );
my @strs;
foreach my $num ( $from .. $to ) {
  push @strs, $base . '[' . $num . ']';
}
旧夏天 2024-10-03 05:14:11

这是我过去做过的一个小小的 pyparsing 练习,适合您的示例(还支持多个范围和不成对的索引,全部用逗号分隔 - 请参阅最后一个测试用例)

from pyparsing import (Suppress, Word, alphas, alphanums, nums, delimitedList, 
    Combine, Optional, Group)

LBRACK,RBRACK,COLON = map(Suppress,"[]:")

ident = Word(alphas+"_", alphanums+"_")
integer = Combine(Optional('-') + Word(nums))
integer.setParseAction(lambda t : int(t[0]))
intrange = Group(integer + COLON + integer)

rangedIdent = ident("name") + LBRACK + delimitedList(intrange|integer)("indexes") + RBRACK

def expandIndexes(t):
    ret = []
    for ind in t.indexes:
        if isinstance(ind,int):
            ret.append("%s[%d]" % (t.name, ind))
        else:
            offset = (-1,1)[ind[0] < ind[1]]
            ret.extend(
                "%s[%d]" % (t.name, i) for i in range(ind[0],ind[1]+offset,offset)
                )
    return ret
rangedIdent.setParseAction(expandIndexes)

print rangedIdent.parseString("abc[0:3]")
print rangedIdent.parseString("abc[3:0]")
print rangedIdent.parseString("abc[0:3,7,14:16,24:20]")

['abc[0]', 'abc[1]', 'abc[2]', 'abc[3]']
['abc[3]', 'abc[2]', 'abc[1]', 'abc[0]']
['abc[0]', 'abc[1]', 'abc[2]', 'abc[3]', 'abc[7]', 'abc[14]', 'abc[15]', 'abc[16]', 'abc[24]', 'abc[23]', 'abc[22]', 'abc[21]', 'abc[20]']

This is a little pyparsing exercise that I've done in the past, adapted to your example (also supports multiple ranges and unpaired indexes, all separated by commas - see the last test case):

from pyparsing import (Suppress, Word, alphas, alphanums, nums, delimitedList, 
    Combine, Optional, Group)

LBRACK,RBRACK,COLON = map(Suppress,"[]:")

ident = Word(alphas+"_", alphanums+"_")
integer = Combine(Optional('-') + Word(nums))
integer.setParseAction(lambda t : int(t[0]))
intrange = Group(integer + COLON + integer)

rangedIdent = ident("name") + LBRACK + delimitedList(intrange|integer)("indexes") + RBRACK

def expandIndexes(t):
    ret = []
    for ind in t.indexes:
        if isinstance(ind,int):
            ret.append("%s[%d]" % (t.name, ind))
        else:
            offset = (-1,1)[ind[0] < ind[1]]
            ret.extend(
                "%s[%d]" % (t.name, i) for i in range(ind[0],ind[1]+offset,offset)
                )
    return ret
rangedIdent.setParseAction(expandIndexes)

print rangedIdent.parseString("abc[0:3]")
print rangedIdent.parseString("abc[3:0]")
print rangedIdent.parseString("abc[0:3,7,14:16,24:20]")

Prints:

['abc[0]', 'abc[1]', 'abc[2]', 'abc[3]']
['abc[3]', 'abc[2]', 'abc[1]', 'abc[0]']
['abc[0]', 'abc[1]', 'abc[2]', 'abc[3]', 'abc[7]', 'abc[14]', 'abc[15]', 'abc[16]', 'abc[24]', 'abc[23]', 'abc[22]', 'abc[21]', 'abc[20]']
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文