2015-11-02 2 views
2

Во время анализа твитов я запускаю слова «, которые имеют либо \, либо/(могут иметь более одного вида в одном« слове »). Я хотел бы иметь такие слова удалены полностью, но не совсем прибить этотУдаление слов со специальными символами «» и «/»

Это то, что я пробовал:

sen = 'this is \re\store and b\\fre' 
sen1 = 'this i\s /re/store and b//fre/' 

slash_back = r'(?:[\w_]+\\[\w_]+)' 
slash_fwd = r'(?:[\w_]+/+[\w_]+)' 
slash_all = r'(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))' 

strt = re.sub(slash_back,"",sen) 
strt1 = re.sub(slash_fwd,"",sen1) 
strt2 = re.sub(slash_all,"",sen1) 
print strt 
print strt1 
print strt2 

Я хотел бы получить:

this is and 
this i\s and 
this and 

Однако, я получаю:

and 
this i\s/and/
i\s /re/store b//fre/ 

Для добавления: в этом случае слово «слово» представляет собой строку, разделенную пробелами или знаками пунктуации ns (как обычный текст)

+1

Красиво задал вопрос. Хотелось бы, чтобы был шаблон вопроса, который следовало использовать, если следовать чему-то подобному. – d0nut

+1

@iismathwizard Мне пришлось перезагрузить страницу, чтобы проверить, правильно ли мои глаза –

ответ

1

Как это? Я добавил некоторые примеры пунктуации:

import re 

sen = r'this is \re\store and b\\fre' 
sen1 = r'this i\s /re/store and b//fre/' 
sen2 = r'this is \re\store, and b\\fre!' 
sen3 = r'this i\s /re/store, and b//fre/!' 

slash_back = r'\s*(?:[\w_]*\\(?:[\w_]*\\)*[\w_]*)' 
slash_fwd = r'\s*(?:[\w_]*/(?:[\w_]*/)*[\w_]*)' 
slash_all = r'\s*(?:[\w_]*[/\\](?:[\w_]*[/\\])*[\w_]*)' 

strt = re.sub(slash_back,"",sen) 
strt1 = re.sub(slash_fwd,"",sen1) 
strt2 = re.sub(slash_all,"",sen1) 
strt3 = re.sub(slash_back,"",sen2) 
strt4 = re.sub(slash_fwd,"",sen3) 
strt5 = re.sub(slash_all,"",sen3) 
print(strt) 
print(strt1) 
print(strt2) 
print(strt3) 
print(strt4) 
print(strt5) 

Выход:

this is and 
this i\s and 
this and 
this is, and! 
this i\s, and! 
this, and! 
+0

Красиво! Работает как сон! Большое спасибо!! – Toly

0

Одним из способов вы можете сделать это без re это с join и пониманием.

sen = 'this is \re\store and b\\fre' 
sen1 = 'this i\s /re/store and b//fre/' 

remove_back = lambda s: ' '.join(i for i in s.split() if '\\' not in i) 
remove_forward = lambda s: ' '.join(i for i in s.split() if '/' not in i) 

>>> print(remove_back(sen)) 
this is and 
>>> print(remove_forward(sen1)) 
this i\s and 
>>> print(remove_back(remove_forward(sen1))) 
this and 
+0

интересный подход! Я только думаю, что это конкретное решение для конкретного случая, когда я ищу универсальное решение. Решение Марка до сих пор работало над самыми дикими струнами из моей коллекции твитов. Спасибо! – Toly

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