2013-10-02 6 views
0

Я пытаюсь фильтровать следующее предложениеPython Regex предложение фильтрации

'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. В любом случае я могу изменить код регулярного выражения, чтобы «+» не был обозначен? Любой альтернативный метод получения желаемого результата также приветствуется, спасибо!

ответ

3

Просто используйте (\w|\+) вместо \w. Это будет использовать как символы слова, так и знак плюса.

В качестве альтернативы вы можете использовать [a-zA-Z+] или в идеале [\w+], как предложено Kyle Strand.

+0

который \ ш вы говорите? есть три из них – user1893354

+0

@ user1893354 Все они. '(\ W | \ +)' будет соответствовать нормальным словам, а также словам, включая знак плюса в них, но использование '[\ w +]' KyleStrand еще лучше. – C0deH4cker

+0

Спасибо! кажется, сработало – user1893354

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', ')'] 
+0

Да, я знаю, что это не будет (я пробовал это :)) – user1893354

Смежные вопросы