gpt4 book ai didi

regex - 给定单词列表,对文本正文进行全词匹配

转载 作者:行者123 更新时间:2023-11-29 09:13:00 25 4
gpt4 key购买 nike

注意:

在我开始做正事之前,我想指出一些其他的 SO 帖子,它们没有完全回答我的问题并且不是这个帖子的重复:

背景:

我在名为 words.txt 的文件中有一个单词列表(每行一个单词)。我想从一个更大的文件 file.txt 中找到所有行,该文件包含 words.txt 中的任何单词。但是,我只想要全字 匹配。这意味着当来自 file.txt 的一行包含至少一个来自 words.txt 的单词“完全独立”的实例时,应该进行匹配(我知道这是含糊不清的,所以请允许我解释一下)。

换句话说,应该在以下情况下进行匹配:

  1. 这个词单独在一条线上
  2. 单词被非字母数字/非连字符包围
  3. 单词在一行的开头,后面跟着一个非字母数字/非连字符
  4. 该词位于行尾且前面有非字母数字/非连字符字符

例如,如果 words.txt 中的单词之一是 cat,我希望它的行为如下:

cat              #=> match
cat cat cat #=> match
the cat is gray #=> match
mouse,cat,dog #=> match
caterpillar cat #=> match
caterpillar #=> no match
concatenate #=> no match
bobcat #=> no match
catcat #=> no match
cat100 #=> no match
cat-in-law #=> no match

先前的研究:

有一个grep 命令几乎 适合我的需要。具体如下:

grep -wf words.txt 文件.txt

选项在哪里:

-w, --word-regexp
Select only those lines containing matches that form whole words.
The test is that the matching substring must either be at the beginning
of the line, or preceded by a non-word constituent character.
Similarly, it must be either at the end of the line or followed by a
non-word constituent character. Word-constituent characters are
letters, digits, and the underscore.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains
zero patterns, and therefore matches nothing.

我遇到的最大问题是它将连字符(即 -)视为“非单词组成字符”。因此(基于上面的示例)对 cat 进行全词搜索将返回 cat-in-law,这不是我想要的想要。

我意识到 -w 选项可能达到了很多人想要的效果。但是,在我的特殊情况下,如果一个词(例如 cat)后跟/前面有一个连字符,那么我需要将其视为更大词的一部分(例如 cat- in-law) 而不是这个词本身的一个实例。

此外,我知道我可以更改 words.txt 以包含正则表达式而不是固定字符串,然后使用:

grep -Ef words.txt file.txt

在哪里

-E, --extended-regexp
Interpret PATTERN as an extended regular expression

但是,我想避免更改 words.txt 并使其不包含正则表达式模式。

问题:

是否有一个简单的 bash 命令可以让我给它一个单词列表并对文本正文执行全词匹配?

最佳答案

我终于想到了解决办法:

grep -Ef <(awk '{print "([^a-zA-Z0-9-]|^)"$0"([^a-zA-Z0-9-]|$)"}' words.txt) file.txt

解释:

  • words.txt是我的单词列表(每行一个)。
  • file.txt是我要搜索的文本正文。
  • awk命令将预处理 words.txt即时,将每个单词包装在一个特殊的正则表达式中以定义其正式的开始和结束(基于我上面问题中发布的规范)。
  • awk命令被 <( 包围和 )以便其输出用作 -f 的输入选项。
  • 我正在使用 -E选项,因为我现在输入的是正则表达式列表,而不是来自 words.txt 的固定字符串.

这里的好处是 words.txt可以保持人类可读性,并且不必包含一堆正则表达式模式。

关于regex - 给定单词列表,对文本正文进行全词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com