<p>其工作原理如下所述:</p>
<pre><code>echo 'abc[1:0]
2 abc
abc 3
[1:0] abc' | perl -lnE 'while (/\[([^]]*)\]/g) {
$s=$1;
while ($s=~/\b(\d+)\b/g) {
$sum+=$1;
}
}
END {
say $sum+$.
}
'
</code></pre>
<p>打印<code>6</code></p>
<p>要理解它,请在适当的位置插入一些<code>say</code>:</p>
<pre><code>echo 'abc[1:0]
2 abc
abc 3
[1:0] abc' | perl -lnE 'while (/\[([^]]*)\]/g) {
$s=$1;
say $s;
while ($s=~/\b(\d+)\b/g) {
say $1;
$sum+=$1;
}
}
END {
say $.;
say $sum+$.
}
'
1:0 first bracketed group from /\[([^]]*)\]/g
1 digits within from $s=~/\b(\d+)\b/g
0
1:0
1
0
4 line count from $.
6 $sum + line count
</code></pre>
<p>对于Python解决方案,可以使用相同的正则表达式并执行以下操作:</p>
<pre><code>import re
total=0
with open(fn) as f: # 'fn' is the path to your file
for i, line in enumerate(f, 1):
if m:=re.findall(r'\[([^]]*)\]', line):
for e in m:
total+=sum(map(int, re.findall(r'\b(\d+)\b', e)))
print(total+i)
</code></pre>
<p>这个正则表达式有一些限制:它不会处理不平衡的或嵌套的括号。这是一个更复杂的正则表达式</p>
<p>Python注意:</p>
<p>{<cd4>}中的{<cd3>}仅为Python 3.9。
对于早期的Python版本,分成两条语句:</p>
<pre><code>m=re.findall(r'\[([^]]*)\]', line)
if m:
...
</code></pre>