0

我正在尝试过滤以下句子

'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中。无论如何我可以修改正则表达式代码以允许“+”不被标记?任何获得所需输出的替代方法也将受到欢迎,谢谢!

4

2 回答 2

3

只需使用(\w|\+)而不是\w. 这将使用单词字符和加号。

或者,您可以按照 Kyle Strand 的建议使用[a-zA-Z+]或理想情况下。[\w+]

于 2013-10-02T19:51:21.307 回答
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++”拆分为三个不同的标记,因此即使排除+fromstring.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', ')']
于 2013-10-02T19:54:10.970 回答