我试图过滤以下句子
'I'm using C++ in high-tech applications!', said peter (in a confident way)
单个词来获取
I'm using C++ in high-tech applications said peter in a confident way
到目前为止我所拥有的是
parsing=re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*",text)
' '.join(w for w in parsing if w not in string.punctuation)
然而这会产生
I'm using C in high-tech applications said peter in a confident way
所以' C ++'错误地变成了' C'因为' +'在string.punctuation中。无论如何,我可以修改正则表达式代码以允许' +#不被标记化?任何获得所需输出的替代方法也将受到欢迎,谢谢!
答案 0 :(得分:3)
只需使用(\w|\+)
代替\w
。这将使用单词字符和加号。
或者,您可以按照Kyle Strand的建议使用[a-zA-Z+]
或理想[\w+]
。
答案 1 :(得分:3)
与C0deH4cker的答案类似但稍微简单一点,用\w
替换[\w+]
的所有实例。
>>> parsing=re.findall(r"[\w+]+(?:[-'][\w+]+)*|'|[-.(]+|\S[\w+]*",text)
>>> parsing
["'", "I'm", 'using', 'C++', 'in', 'high-tech', 'applications', '!', "'", ',', 'said', 'peter', '(', 'in', 'a', 'confident', 'way', ')']
>>> ' '.join(w for w in parsing if w not in string.punctuation)
"I'm using C++ in high-tech applications said peter in a confident way"
请注意,您的原始解决方案会将“C ++”拆分为三个不同的令牌,因此即使从+
中排除string.punctuation
也无法解决您的问题:
>>> parsing=re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*",text)
>>> parsing
["'", "I'm", 'using', 'C', '+', '+', 'in', 'high-tech', 'applications', '!', "'", ',', 'said', 'r', '(', 'in', 'a', 'confident', 'way', ')']