Skip to main content
 首页 » 编程设计

python之计算文件中所有可能的长度为 n 的子字符串 (不包括空格)

2025年05月04日32java哥

我有一些导出文件,你可以假设它们在一行中有很多单词并且没有一行是特殊的。我看到这个帖子在一个文件中生成不同的词

https://unix.stackexchange.com/questions/286464/all-possible-permutations-of-words-in-different-files-in-pairs

还有一些在文件中进行单词搜索的其他变体。

但是对于长度为 4 的子串,我需要的是类似这样的东西。这里我们有子字符串和它的计数。

示例文件内容

no apples  
no apples 
mango is great 
banana is expensive 
test 

示例输出是

appl 2 
pple 2 
ples 2 
mang 1 
ango 1 
grea 1 
reat 1 
bana 1 
anan 1 
nana 1 
expe 1 
xpen 1 
pens 1 
ensi 1 
sive 1 
nsiv 1 
test 1 

子串不一定有任何意义,它们只是文件的子串。文件不大,最坏情况下不到5MB,实际上有多个文件,但我在分析前合并了它们。

我想在 SO 中提问,因为万一这需要编写一个 shell/phyton 脚本,但如果我们可以使用命令轻松地做到这一点,那就更好了。

请您参考如下方法:

你也可以试试 Perl

perl -lne ' while(/(\S+)/g) { $x=$1;  
      while($x=~/\b(?=(\w{4}))|\B(?=(\w{4}))\B|(?=(\w{4}))\b/g) { $kv{"$1$2$3"}++ }}  
       END { print "$_ $kv{$_}" for(keys %kv) }  ' file 

根据您给定的输入

$ cat test.txt 
no apples 
no apples 
mango is great 
banana is expensive 
test 
 
$ perl -lne ' while(/(\S+)/g) { $x=$1;  
     while($x=~/\b(?=(\w{4}))|\B(?=(\w{4}))\B|(?=(\w{4}))\b/g) { $kv{"$1$2$3"}++ }} 
       END { print "$_ $kv{$_}" for(keys %kv) }  ' test.txt 
nsiv 1 
xpen 1 
reat 1 
ensi 1 
sive 1 
ples 2 
pple 2 
test 1 
appl 2 
expe 1 
anan 1 
mang 1 
ango 1 
bana 1 
pens 1 
grea 1 
nana 1 
 
$ 

您可以在 BEGIN block 内参数化为

$ perl -lne ' BEGIN { $t=qr(\w{5}) }  
     while(/(\S+)/g) { $x=$1; while($x=~/\b(?=($t))|\B(?=($t))\B|(?=($t))\b/g) 
        { $kv{"$1$2$3"}++ }}  
           END { print "$_ $kv{$_}" for(keys %kv) }  ' test.txt 
great 1 
pples 2 
apple 2 
expen 1 
nsive 1 
banan 1 
anana 1 
ensiv 1 
pensi 1 
xpens 1 
mango 1 
 
$