2017-04-21 11 views
0

私は次のコードを持っています。Pythonの正規表現エラー:TypeError:期待される文字列またはバイト状のオブジェクト

import datetime 
import re 


class Entry: 
    task_name = None 
    minutes = None 
    notes = None 
    created_at = None 

    def __init__(self, task_name=None, minutes=None, 
       created_at=None, notes=None): 
     if task_name: 
      self.task_name = task_name 
      self.minutes = int(minutes) 
      self.created_at = datetime.datetime.strptime(
                created_at, 
                "%Y-%m-%d %H:%M:%S.%f") 
      self.notes = notes 
     else: 
      self.get_task_details() 

    # get task name, num of minutes and notes if required 
    def get_task_details(self): 
     self.task_name = input("Enter the name of the task: ") 
     self.minutes = self.get_minutes() 
     self.notes = self.get_notes() 
     self.created_at = datetime.datetime.now() 

    # get num of minutes and verify it 
    # the user should enter a valid input 
    def get_minutes(self): 
     while True: 
      minutes = input("Enter the number of minutes spent on the task: ") 
      if minutes: 
       try: 
        minutes = int(minutes) 
        return minutes 
       except ValueError: 
        print("Please Enter a valid num of minutes") 
      else: 
       print("Please enter a valid input. ex 12") 

    # print task info 
    def get_task_info(self): 
     print("You created your task at") 
     created_at_formatted = self.created_at.strftime("%m/%d/%Y %H:%M") 
     print("{}".format(created_at_formatted)) 

    # get notes if the user wants to 
    # else: leave it with a value of None 
    def get_notes(self): 
     answer = input("Do you want to write any note on this task ? N/y >>> ") 
     if answer.lower() == "y": 
      note = input("Enter your note >>> ") 
      return note 
     else: 
      self.notes = None 
      print("Alright. No notes are added") 

    def __str__(self): 
     return """ 
     Task Name: {} 
     Created At: {} 
     Minutes Spend: {} 
     Notes: {} 
     """.format(self.task_name, self.created_at, self.minutes, self.notes) 

class Log: 
    e = Entry() 
    entries = [] 
    entries.append(e) 

    def find_by_pattern(self): 
     """find by regex pattern""" 
     regex = input("Enter your regex >>> ") 
     try: 
      regex = re.compile(r'{}'.format(regex), re.X) 
     except sre_constants.error: 
      print("Invalid regex") 
      regex = None 
     entries_found = [] 
     # check if the user entered a regex 
     if regex: 
      for entry in self.entries: 
       if (re.findall(regex, entry.task_name) or 
         re.findall(regex, entry.notes)): 
         entries_found.append(entry) 
     else: 
      print("Please enter a valid regex") 

     if entries_found: 
      if entries_found: 
       print("We found the following entries") 
       for entry in entries_found: 
        print("{}".format(entry)) 
     else: 
      print("No entries were found based on your pattern") 

if __name__ == "__main__": 
    l = Log() 
    l.find_by_pattern() 

私はプログラムを実行し、 '\ w {4}'の正規表現を入力します。それはクラッシュする しかし、私はプログラムを実行し、同じ正規表現を引用符なしで入力する:\ w {r}、それはクラッシュしません。これが原因で正規表現のクラッシュではなく、findallは、文字列を期待しながら、理由のentry.notesNoneである

enter image description here

答えて

1

:ここに は私がやろうとしています何のより鮮明な画像です。

最初の例では正規表現がentry.task_nameと一致し、条件行の88〜89の他の部分がスキップされるために動作します。
しかし、引用符を入力すると、正規表現は最初の部分(引用符が必要です)と一致せず、後者の場合には、Noneがクラッシュします。

これを確認するには、メモを入力しますが、空の文字列に属性を初期化することは賢明かもしれませんが、クラッシュしません。

PS:get_notesにノートがある場合はそれを返しますが、それ以外の場合は実際の値を返すことができることに注意してください(または、27行目に関数が返されて設定されていないと値が消去されます)

import datetime 
import re 


class Entry: 
    task_name = "" 
    minutes = None 
    notes = "" 
    created_at = None 

    def __init__(self, task_name=None, minutes=None, 
       created_at=None, notes=""): 
     if task_name: 
      self.task_name = task_name 
      self.minutes = int(minutes) 
      self.created_at = datetime.datetime.strptime(
                created_at, 
                "%Y-%m-%d %H:%M:%S.%f") 
      self.notes = notes 
     else: 
      self.get_task_details() 

    # get task name, num of minutes and notes if required 
    def get_task_details(self): 
     self.task_name = input("Enter the name of the task: ") 
     self.minutes = self.get_minutes() 
     self.notes = self.get_notes() 
     self.created_at = datetime.datetime.now() 

    # get num of minutes and verify it 
    # the user should enter a valid input 
    def get_minutes(self): 
     while True: 
      minutes = input("Enter the number of minutes spent on the task: ") 
      if minutes: 
       try: 
        minutes = int(minutes) 
        return minutes 
       except ValueError: 
        print("Please Enter a valid num of minutes") 
      else: 
       print("Please enter a valid input. ex 12") 

    # print task info 
    def get_task_info(self): 
     print("You created your task at") 
     created_at_formatted = self.created_at.strftime("%m/%d/%Y %H:%M") 
     print("{}".format(created_at_formatted)) 

    # get notes if the user wants to 
    # else: leave it with a value of None 
    def get_notes(self): 
     answer = input("Do you want to write any note on this task ? N/y >>> ") 
     if answer.lower() == "y": 
      note = input("Enter your note >>> ") 
      return note 
     else: 
      return "" 
      print("Alright. No notes are added") 

    def __str__(self): 
     return """ 
     Task Name: {} 
     Created At: {} 
     Minutes Spend: {} 
     Notes: {} 
     """.format(self.task_name, self.created_at, self.minutes, self.notes) 

class Log: 
    e = Entry() 
    entries = [] 
    entries.append(e) 

    def find_by_pattern(self): 
     """find by regex pattern""" 
     regex = input("Enter your regex >>> ") 
     try: 
      regex = re.compile(r'{}'.format(regex), re.X) 
     except sre_constants.error: 
      print("Invalid regex") 
      regex = None 
     entries_found = [] 
     # check if the user entered a regex 
     if regex: 
      for entry in self.entries: 
       if (re.findall(regex, entry.task_name) or 
         re.findall(regex, entry.notes)): 
         entries_found.append(entry) 
     else: 
      print("Please enter a valid regex") 

     if entries_found: 
      if entries_found: 
       print("We found the following entries") 
       for entry in entries_found: 
        print("{}".format(entry)) 
     else: 
      print("No entries were found based on your pattern") 

if __name__ == "__main__": 
    l = Log() 
    l.find_by_pattern() 
:ここ

はすぐに/悪い固定バージョンです

関連する問題