Удаление слова, содержащего такие символы, как «#», «@» или «:» в python

#python #python-3.x #for-loop

#python #python-3.x #for-цикл

Вопрос:

Я только начал изучать программирование на Python в этом семестре, и нам дается несколько упражнений по пересмотру. Однако я застрял на одном из вопросов. В приведенном текстовом файле представлены твиты с выборов в США в 2016 году. Пример, как показано ниже:

 I wish they would show out takes of Dick Cheney #GOPdebates
Candidates went after @HillaryClinton 32 times in the #GOPdebate-but remained silent about the issues that affect us. 
It seems like Ben Carson REALLY doesn't want to be there. #GOPdebates
RT @ColorOfChange: Or better said: #KKKorGOP #GOPDebate
  

Вопрос требует, чтобы я написал программу на Python, которая считывает данные из файла tweets.txt . Помните, что каждая строка содержит один твит. Для каждого твита ваша программа должна удалять любое слово длиной менее 8 символов, а также любое слово, содержащее символ хэша (#), at (@) или двоеточие (:). Что у меня есть сейчас:

 for line in open("tweets.txt"):
  aline=line.strip()
  words=aline.split()
  length=len(words)
  remove=['#','@',':']
  for char in words:
    if "#" in char:
      char=''
    if "@" in char:
      char=''
    if ":" in char:
      char=''
  

это не сработало, и результирующий список по-прежнему содержит @, # или :. Любая помощь приветствуется! Спасибо!

Комментарии:

1. строки неизменяемы, вам нужно создать новую строку, отфильтрованную в соответствии с вашими предпочтениями

2. Список ‘удалить’ не нужен

3. Вам было бы лучше поместить каждую строку в список, а затем использовать цикл for для этого

Ответ №1:

Присвоение char='' в цикле не изменяет и не удаляет фактический символ (фактически слово) в списке, оно просто присваивает переменной другое значение char .

Вместо этого вы можете использовать выражение понимания / генератора списка для фильтрации слов, удовлетворяющих условиям.

 >>> tweet = "Candidates went after @HillaryClinton 32 times in the #GOPdebate-but remained silent about the issues that affect us."
>>> [w for w in tweet.split() if not any(c in w for c in "#@:") and len(w) >= 8]
['Candidates', 'remained']
  

При необходимости используйте ' '.join(...) для объединения оставшихся слов обратно в «предложение», хотя это может не иметь особого смысла.

Ответ №2:

Используйте этот код.

 import re
tweet=re.sub(r'#', '',tweet )
tweet=re.sub(r'@', '',tweet )
tweet=re.sub(r':', '',tweet )
  

Комментарии:

1. Ни одно из них не является регулярным выражением, поэтому вы можете просто использовать str.replace . Или используйте re.sub with r"[#@:]" , но это приведет только к удалению этих символов, а не слов, содержащих эти символы.

Ответ №3:

Приведенное ниже действие откроет файл (обычно лучше использовать «с открытым» при работе с файлами), перебирает все строки и удаляет ‘#@:’ с помощью translate . Затем удалите слова, содержащие менее 8 символов, что даст вам вывод «new_line».

 with open('tweets.txt') as rf:
    for sentence in rf:
        line = sentence.strip()
        line = line.translate({ord(i): None for i in '#@:'})
        line = line.split()
        new_line = [ word for word in line if len(word) >= 8 ]
        print(new_line)
  

Это не самый краткий способ, и, безусловно, есть лучшие способы сделать это, но, вероятно, его немного легче читать и понимать, как будто вы только начали учиться, как я.

Комментарии:

1. Спасибо! Нас учили циклам for, поэтому я просто использовал его, но я посмотрю и выучу «with»