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ください。これは単語文字とプラス記号の両方を使用します。

[a-zA-Z+]または、理想的[\w+]には Kyle Strand が提案するように orを使用することもできます。

于 2013-10-02T19:51:21.307 に答える
3

C0deH4cker's answer に似ていますが、少し単純で、 のすべてのインスタンスを に置き換え\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++」を3つの異なるトークンに分割するため、除外+しても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', ')']
于 2013-10-02T19:54:10.970 に答える