Regex Grep等:重叠匹配
用于: 我得到:Regex Grep等:重叠匹配,regex,grep,Regex,Grep,用于: 我得到: echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+' 但我想: the quick brown fox 如何使用?使用awk: the quick quick brown brown fox 输出: #!/usr/bin/python3.5 import re s="the quick brown fox" matches = re.finditer(r'(?=(\b[a-z]+\b \b[a-z]+\b))',s)
echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+'
但我想:
the quick
brown fox
如何使用?使用awk
:
the quick
quick brown
brown fox
输出:
#!/usr/bin/python3.5
import re
s="the quick brown fox"
matches = re.finditer(r'(?=(\b[a-z]+\b \b[a-z]+\b))',s)
ans=[i.group(1) for i in matches]
print(ans) #or not print
for i in ans:
print(i)
另一个awk:
['the quick', 'quick brown', 'brown fox']
the quick
quick brown
brown fox
awk'{print$1,$2rs$2,$3rs$3,$4}'只需重复使用原始解决方案即可获得马尔可夫链:
awk '{print $1,$2 RS $2,$3 RS $3,$4}' <<<"the quick brown fox"
the quick
quick brown
brown fox
第二行(即sed)删除输入的第一个字。因此,命令的其余部分将生成缺少的对
同样的方法也可以使用sed运行循环的能力进行推广:
echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+'
echo "the quick brown fox" | sed 's/^[a-z]* //' | grep -Po '[a-z]+ [a-z]+'
echo pattern1pattern2 | sed”:开始;s/\(模式1\)\(模式2\)/\2/;t启动“|grep-o”]*>“|tr-d”|”
此解决方案将使用部分重叠的模式,其中pattern2
可以被下一个匹配重叠。它假定|
为保留辅助字符。此外,它还假设pattern1pattern2
regex无法匹配任何单独由pattern2
匹配的字符串
sed将pattern1pattern2
替换为pattern2
,并在找到任何匹配项时重复此替换(分支t
命令允许匹配先前替换的字符串,与g
选项不同)。也就是说,在每次迭代中,一个
组被留下来表示我们的匹配,而模式2的一个实例仍然可以在下一次匹配中匹配。最后,我们使用原始方法选取组并去除辅助标记 我不是专家,但我不认为你能用grep做到这一点。您应该尝试编写一个perl或awk脚本。使用perl,您可以轻松地完成这项工作,而不是使用grep,因为grep不允许访问捕获组内容。如果您使用可以打印组的内容,则重叠模式是([a-z]+)(?=([a-z]+)
打印$1$2
的最终目标是什么?要匹配每一对连续的单词?可能会有奇数的单词或中间的一些数字吗?这个问题的目的是更一般的意义。我想我没有说清楚。一般来说,我希望以返回所有可能匹配项的方式对输入运行正则表达式。我看到的行为不会返回“quick brown”,即使它是一个有效的匹配项。我在30秒前的上述评论也适用于这里。-Po
的意思与OP的意思相同(即Perl Regexp表示-P,而-o表示“仅输出匹配”)。正则表达式也完全相同。但是,我将添加对sed的解释。。。
echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+'
echo "the quick brown fox" | sed 's/^[a-z]* //' | grep -Po '[a-z]+ [a-z]+'
echo pattern1pattern2 | sed ':start;s/\(pattern1\)\(pattern2\)/<\1|\2>\2/;t start' | grep -o '<[^>]*>' | tr -d '<>|'