Предположим, что вам нужно извлечь #Hashtags
из предложения, полного символов пунктуации. Допустим, что #stackoverflow #people
и #helpful
оканчиваются разными символами, вы хотите извлечь их из text
, но вы можете избежать повторений:
>>> text = "I love #stackoverflow, because #people... are very #helpful! Are they really #helpful??? Yes #people in #stackoverflow are really really #helpful!!!"
если вы попытаетесь использовать только set([i for i in text.split() if i.startswith("#")])
, вы получите:
>>> set(['#helpful???',
'#people',
'#stackoverflow,',
'#stackoverflow',
'#helpful!!!',
'#helpful!',
'#people...'])
что, на мой взгляд, излишне. Лучшее решение с использованием RE с модулем re
:
>>> import re
>>> set([re.sub(r"(\W+)$", "", j) for j in set([i for i in text.split() if i.startswith("#")])])
>>> set(['#people', '#helpful', '#stackoverflow'])
Теперь это нормально для меня.
РЕДАКТИРОВАТЬ: ЮНИКОД #Hashtags
Добавьте флаг re.UNICODE
, если вы хотите удалить знаки пунктуации, но при этом сохранить буквы с акцентами, апострофами и прочей кодировкой Unicode, что может быть важно, если ожидается, что #Hashtags
будет не только на английском языке Может быть, это всего лишь кошмар итальянского парня, а может и нет! ; -)
Например:
>>> text = u"I love #stackoverflòw, because #peoplè... are very #helpfùl! Are they really #helpfùl??? Yes #peoplè in #stackoverflòw are really really #helpfùl!!!"
будет в кодировке Unicode как:
>>> u'I love #stackoverfl\xf2w, because #peopl\xe8... are very #helpf\xf9l! Are they really #helpf\xf9l??? Yes #peopl\xe8 in #stackoverfl\xf2w are really really #helpf\xf9l!!!'
, и вы можете получить свой (правильно закодированный) #Hashtags
следующим образом:
>>> set([re.sub(r"(\W+)$", "", j, flags = re.UNICODE) for j in set([i for i in text.split() if i.startswith("#")])])
>>> set([u'#stackoverfl\xf2w', u'#peopl\xe8', u'#helpf\xf9l'])
EDITx2: UNICODE #Hashtags
и контроль для #
повторений
Если вы хотите контролировать несколько повторений символа #
, например, (извините, если пример text
стал почти нечитаемым):
>>> text = u"I love ###stackoverflòw, because ##################peoplè... are very ####helpfùl! Are they really ##helpfùl??? Yes ###peoplè in ######stackoverflòw are really really ######helpfùl!!!"
>>> u'I love ###stackoverfl\xf2w, because ##################peopl\xe8... are very ####helpf\xf9l! Are they really ##helpf\xf9l??? Yes ###peopl\xe8 in ######stackoverfl\xf2w are really really ######helpf\xf9l!!!'
тогда вы должны заменить эти множественные вхождения уникальным #
.
Возможное решение состоит в том, чтобы ввести другое вложенное неявное определение set()
с функцией sub()
, заменяющей вхождения больше-1 #
одним #
:
>>> set([re.sub(r"#+", "#", k) for k in set([re.sub(r"(\W+)$", "", j, flags = re.UNICODE) for j in set([i for i in text.split() if i.startswith("#")])])])
>>> set([u'#stackoverfl\xf2w', u'#peopl\xe8', u'#helpf\xf9l'])