2015-01-22 8 views
2

Я использую PRAW, чтобы создать reddit-бот, который берет автора комментариев того, кто говорит «alot», и сохраняет свое имя пользователя в списке. У меня возникают проблемы с регулярным выражением и как заставить строку работать. Вот мой код.Использование регулярных выражений для сопоставления слова в Python

#importing praw for reddit api and time to make intervals 

import praw 
import time 
import re 


username = "LewisTheRobot" 
password = 



r = praw.Reddit(user_agent = "Counts people who say alot") 

word_to_match = ['\balot\b'] 

storage = [] 

r.login(username, password) 

def run_bot(): 
    subreddit = r.get_subreddit("test") 
    print("Grabbing subreddit") 
    comments = subreddit.get_comments(limit=200) 
    print("Grabbing comments") 
    for comment in comments: 
     comment_text = comment.body.lower() 
     isMatch = any(string in comment_text for string in word_to_match) 
     if comment.id not in storage and isMatch: 
      print("Match found! Storing username: " + str(comment.author) + " into list.") 
      storage.append(comment.author) 


    print("There are currently: " + str(len(storage)) + " people who use 'alot' instead of ' a lot'.") 


while True: 
    run_bot() 
    time.sleep(5) 

поэтому регулярное выражение, которое я использую, ищет слово alot вместо alot как часть строки. Пример ze alot. Всякий раз, когда я запускаю это, он не найдет комментариев, которые я сделал. Какие-либо предложения?

ответ

3

Вы проверка с строковыми операциями, не RE те, в

isMatch = any(string in comment_text for string in word_to_match) 

Первый in здесь не проверяет подстроки - ничего общего с УЭ.

Изменить это

isMatch = any(re.search(string, comment_text) for string in word_to_match) 

Кроме того, у Вас есть ошибка в вашем инициализации:

word_to_match = ['\balot\b'] 

'\b' есть символ с кодом 0x08 (забой). Всегда использовать сырые строки синтаксис для моделей RE, чтобы избежать подобных ловушек:

word_to_match = [r'\balot\b'] 

Теперь вы будете иметь несколько символов, то обратный слэш b, что RE будет интерпретировать означает «граница слова».

Там могут быть и другие ошибки, но я стараюсь не смотреть больше двух ошибок на вопрос ... :-)

+0

Спасибо Алекс за отличный ответ, который пошел глубже, чем мой актуальный вопрос! – Lewis

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