首页 > 解决方案 > 用 Python 从电视节目中提取星期几

问题描述

我有以下电视节目的列表

(ABC)-(O)-(Mon-Fri)-(20:30-21:00)

(DEF)-(O)-(Mon-Sat)-(19:00-20:00)

(GHI)-(R)-(Mon-Tue,Thu-Fri,Sun)-(09:00-12:00)

(JKL)-(R)-(Mon,Wed,Fri-Sun)-(14:30-15:30)

(MNO)-(R)-(Fri)-(16:30-17:00)

格式是 - ABC、DEF,等等是节目名称,O 或 R 是节目的剧集是全新的还是重复播出的,Mon-Fri 等等是节目的星期几播出之后是播出时间。

我有兴趣在 Python 3 中使用 Regex 来提取每个节目播出的星期几。考虑一下节目 GHI:它在周一、周二而不是周三播出,在周四和周五播出,而不是在周六播出,然后在周日再次播出。节目 ABC 在包括周一和周五在内的所有日子播出。

谢谢你。

对于 GHI,它在一周中的哪几天播出应该是

TVShow["GHI"]["DaysofWeek"] = ["Monday", "Tuesday", "Thursday", "Friday", "Sunday"]

标签: python-3.x

解决方案


思考过程:

  1. 首先获取频道名称和日期
  2. 将频道名称设置为字典中的键
  3. 用连字符分割天数并记录范围
  4. 当有日期范围时,将这些日期转换为整数值以进行迭代并创建范围列表
  5. 将范围列表合并为一个简单列表
  6. 将日期值与全天列表匹配
  7. 将其分配给节目的 DaysofWeek 键
    import re

    def main ():
        shows = {}
        tvshows = '''(ABC)-(O)-(Mon-Fri)-(20:30-21:00)
                    (DEF)-(O)-(Mon-Sat)-(19:00-20:00)
                    (GHI)-(R)-(Mon-Tue,Thu-Fri,Sun)-(09:00-12:00)
                    (JKL)-(R)-(Mon,Wed,Fri-Sun)-(14:30-15:30)
                    (MNO)-(R)-(Fri)-(16:30-17:00)'''
        tvshows = tvshows.split ('\n')      # Break up new lines into a separate list
        for tvshow in tvshows:
            channel = re.findall (r'\((.*?)\)', tvshow)     # Regex return ['ABC', 'O', 'Mon-Fri', '20:30-21:00']
            shows.setdefault (channel [0], {})              # Set key to channel/tv show name
            shows [channel [0]].setdefault ('DaysofWeek', get_day (channel [2]))     # Assign 'DaysofWeek' as key and the show days as value
        print (shows)
        print (shows ['GHI']['DaysofWeek'])

    def get_day (show_days):
        day_ranges = []
        rangelist = []
        abbr_day = {'Mon': 0, 'Tue': 1, 'Wed': 2, 'Thu': 3, 'Fri': 4, 'Sat': 5, 'Sun': 6}
        full_day = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
        show_days = show_days.split (',')       # Split by comma within show day
        show_days = [day.split ('-') for day in show_days]      # Split by hyphen.  Results:  [['Mon', 'Tue'],
                                                                # ['Thu', 'Fri'], ['Sun']]
        # Converting abbreviated days to integers
        for days in show_days:
            temp = [abbr_day [day] for day in days if day in abbr_day]  # Check show day matching abbreviated days, if
                                                                        # matches, get its corresponding integer value
            rangelist.append (range (temp [0], temp [-1] + 1))  # Combined everything into a list of range.
                                                                # Example:  [range(0, 2), range(3, 6), range(6, 7)]
        # Loop through the list of ranges and combine into one single list.  Example: [0, 1, 3, 4, 5, 6]
        day_ranges = [j for i in rangelist for j in i if j not in rangelist]
        # Convert the integers value back to full day and put it in a list
        tv_days = [full_day [day] for day in day_ranges]
        return tv_days

    if __name__ == '__main__':
        main ()

输出:

print ('shows [\'GHI\'][\'DaysofWeek\'] = ', shows ['GHI']['DaysofWeek'])
shows ['GHI']['DaysofWeek'] =  ['Monday', 'Tuesday', 'Thursday', 'Friday', 'Sunday']

推荐阅读