根据周围的标点符号过滤掉单词
Filter out words depending on surrounding punctuation
Objective:
我正在寻找一种根据单词是否被引号 ' '
、guillemets « »
或圆括号 ( )
包围来匹配或跳过单词的方法。
期望结果示例:
len(re.findall("my word", "blablabla 'my word' blablabla"))
应该 return 0
因为从语言上讲 my word
=/= 'my word'
因此不应该匹配;
len(re.findall("'my word'", "blablabla 'my word' blablabla"))
应该 return 1
因为从语言上讲 'my word'
= 'my word'
因此应该匹配;
但问题是——len(re.findall("my word", "blablabla «my word» blablabla"))
和 len(re.findall("my word", "blablabla (my word) blablabla"))
都应该 return 1
.
我的尝试:
我有以下表达式(如果我错了请纠正我)但我不知道如何实现它:(?<!\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 个单词,如果它们前面有引号)。
Objective:
我正在寻找一种根据单词是否被引号 ' '
、guillemets « »
或圆括号 ( )
包围来匹配或跳过单词的方法。
期望结果示例:
len(re.findall("my word", "blablabla 'my word' blablabla"))
应该 return0
因为从语言上讲my word
=/='my word'
因此不应该匹配;len(re.findall("'my word'", "blablabla 'my word' blablabla"))
应该 return1
因为从语言上讲'my word'
='my word'
因此应该匹配;但问题是——
len(re.findall("my word", "blablabla «my word» blablabla"))
和len(re.findall("my word", "blablabla (my word) blablabla"))
都应该 return1
.
我的尝试:
我有以下表达式(如果我错了请纠正我)但我不知道如何实现它:(?<!\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 个单词,如果它们前面有引号)。