【发布时间】:2020-07-06 23:03:46
【问题描述】:
在 Perl 中,很容易遍历字符串以将其分块为标记:
$key = ".foo[4][5].bar.baz";
@chunks = $key =~ m/\G\[\d+\]|\.[^][.]+/gc;
print "@chunks\n";
#>> output: .foo [4] [5] .bar .baz
# Optional error handling:
die "Malformed key at '" . substr($key, pos($key)) . "'"
if pos($key) != length($key);
如果需要更多控制,可以改为循环:
while ($key =~ m/(\G\[\d+\]|\.[^][.]+)/g) {
push @chunks, $1; # Optionally process each one
}
我想在 Python 中找到一种干净、惯用的方式来执行此操作。到目前为止我只有这个:
import re
key = ".foo[4][5].bar.baz"
rx = re.compile(r'\[\d+\]|\.[^][.]+')
chunks = []
while True:
m = re.match(rx, key)
if not m:
raise ValueError(f"Malformed key at '{key}'")
chunk = m.group(0)
chunks.append(chunk[1:] if chunk.startswith('.') else int(chunk[1:-1]))
key = key[m.end(0):]
if key == '':
break
print(chunks)
除了它更冗长之外,我不喜欢它,因为我需要在处理它时销毁字符串,因为似乎没有相当于 Perl 的 \G 锚(拿起哪里最后一场比赛结束了)。另一种方法是在每个循环中跟踪我自己在字符串中的匹配位置,但这似乎更加繁琐。
有没有我没找到的成语?我还尝试了一些使用re.finditer() 的解决方案,但它似乎没有办法让每场比赛都在前一场比赛的确切结束处开始(例如re.matchiter() 或类似的)。
欢迎提出建议和讨论。
【问题讨论】: