根据周围的标点符号过滤掉单词

Filter out words depending on surrounding punctuation

Objective:

我正在寻找一种根据单词是否被引号 ' '、guillemets « » 或圆括号 ( ) 包围来匹配或跳过单词的方法。

期望结果示例:

我的尝试:

我有以下表达式(如果我错了请纠正我)但我不知道如何实现它:(?<!\w)'[^ ].*?\w*?[^ ]'

我想编写以下代码 len(re.findall(r'(?<!\w)'+re.escape(myword)+r'(?!\w)', sentence))——我认为其目的是去除标点符号——考虑到上述所有情况。

目前,我的代码检测到 'my word' 内部的 my word,这不是我想要的。

提前致谢!

我认为其中一种策略是使用 negative look-ahead 功能:

my_word = "word"
r"(?!'" + my_word + "')[^']" + "my_word"

这应该可以完成工作 check here

由于否定先行不消耗字符,为了防止匹配,您需要使用 [^'] 以确保引号 ' 不是 my_word 之前的允许字符. ^ 开始枚举字符正是这个意思。

如果您想扩展引号列表,使该单词不被计入已找到的单词,只需将 ' 更改为不允许的字符列表:

r"(?!['`]" + my_word + "['`])[^'`]my_word"

值得注意的是,@Prasanna 问题中的示例将无法使用正则表达式进行匹配。您需要使用适当的解析器 - 例如pyparsing - 处理这种情况,因为正则表达式无法处理需要两个任意字符数才能匹配的匹配(例如,任意数量的 'a' 后跟相同数量的 'b'字母)并且不可能创建具有先行处理 n 个单词然后 myword 并同时跳过 的通用正则表达式n 个单词,如果它们前面有引号)。