Python中的复杂数据提取

Python中的复杂数据提取,python,data-extraction,Python,Data Extraction,我需要一些帮助来启动一个程序。我每周都会参加几场在线扑克比赛。事实证明,我使用的网站记录了手的历史记录,并将它们作为.txt文件保存到我的硬盘上。不幸的是,数据的格式有些粗糙。我想创建一个程序,记录每一只手,告诉我我赢了或输了多少。我在下面粘贴了一只手的样本,我想从每只手上提取以下信息 盲板和赌注。向下滚动示例,可以看到“玩家8有小盲板(250)”,然后是“玩家1有大盲板(500)”。以上提到了每位玩家的赌注“玩家英雄赌注(50)”。在这种情况下,小盲=250,大盲=500,安特=50 我的堆栈

我需要一些帮助来启动一个程序。我每周都会参加几场在线扑克比赛。事实证明,我使用的网站记录了手的历史记录,并将它们作为.txt文件保存到我的硬盘上。不幸的是,数据的格式有些粗糙。我想创建一个程序,记录每一只手,告诉我我赢了或输了多少。我在下面粘贴了一只手的样本,我想从每只手上提取以下信息

  • 盲板和赌注。向下滚动示例,可以看到“玩家8有小盲板(250)”,然后是“玩家1有大盲板(500)”。以上提到了每位玩家的赌注“玩家英雄赌注(50)”。在这种情况下,小盲=250,大盲=500,安特=50

  • 我的堆栈大小。我已将我的玩家表示为“英雄”。我的堆栈大小在第6行,上面写着“座位3:英雄(17595)”。在本例中,我的堆栈大小为17595

  • 我的手。在本例中,它由“玩家英雄收到的牌:[10c];玩家英雄收到的牌:[7h]”表示。所以我的手是“10c7h”

  • 玩家数量。样本中有8名玩家

  • 我的位置。这个可能很棘手。我决定从大盲板开始,给它赋值0。小盲=1,按钮=2,等等。这在某种程度上违背了“扑克逻辑”,但从编程的角度来看,对我来说更有意义,因为总会有大盲,而其他一些位置将取决于桌上有多少玩家

  • 利润/损失。这在“摘要”标签下文本的底部附近。“玩家英雄不展示牌。赌注:50。收集:0。损失:50。”在这种情况下,我的利润是-50(即损失50),这意味着我支付了50赌注并合手

  • 下面是.txt文件的外观。注意这是一只手。在实际的.txt文件中,这只手后面会跟着几十只或数百只其他手。开始总是用“游戏开始”表示,最后一行总是说“游戏结束”

    感谢您的帮助。甚至只是一些关于我如何做这件事或者我应该学习什么样的东西的想法。在我看来,输出应该是这样的:

    HandNumber = 000001
    BigBlind = 500
    Ante = 50
    Players = 8
    StackSize = 17595
    Hand = 10c7h
    Position = 6    # small blind = 1; add 5 since I'm 5 positions removed
    Profit = -50
    

    我的经验水平:我参加了大约6个月的Python开发、数据科学和SQL在线课程。我对类有一些熟悉,但没有太多创建自己的类的经验。我设计了一些程序,帮助使用正则表达式从财务报表中提取数据

    通过使用正则表达式分割不同的游戏,然后使用更多正则表达式提取信息,这将是最容易解决的问题。 我会制作一个类来保存所有这些信息。然后您可以使用db或json来存储此信息

    def split_file(file_handle):
        pat_str = '''\
    ^Game started at: (?P<game_start>.*?)
    (?P<game>.*?)
    ^------ Summary ------
    (?P<summary>.*)
    ^Game ended at: (?P<game_end>.*)$\
    '''
        pat = re.compile(pat_str, flags=re.MULTILINE|re.DOTALL)
        text = file_handle.read()
        for game in pat.finditer(text):
            yield game
    
    class Pokergame:
        def __init__(self, game_info, playername = 'Hero'):
            self.game_start = datetime.datetime.strptime(game_info['game_start'], "%Y/%m/%d %H:%M:%S")
            self.game_end = datetime.datetime.strptime(game_info['game_end'], "%Y/%m/%d %H:%M:%S")
            self.game_info = _parse_game(game_info['game'], playername)
            self.summary = _parse_summary(game_info['summary'], playername)
    
    def _parse_game(game_str, playername):
        pattern_seat = f'Seat (\d+): {playername} \((\d+)\).'
        seat_match = re.search(pattern=pattern_seat, string=game_str)
        if seat_match:
            seat, stack = seat_match.groups()
        pattern_cards = f'Player {playername} received card: \[(?P<card>\w+)\]'
        cards = tuple(i['card'] for i in re.finditer(pattern_cards, game_str))
    
        result = {
            'seat': seat,
            'stack': stack,
            'cards': cards,
            'text': game_str,
        }
        return result   
    
    def _parse_summary(summary_str, playername):
    
        return summary_str
    
    
    games = []
    with StringIO(hand_text) as file_handle:
        for game_info in split_file(file_handle):
            games.append(Pokergame(game_info))
    
    def split_file(file_handle):
        pat_str = '''\
    ^Game started at: (?P<game_start>.*?)
    (?P<game>.*?)
    ^------ Summary ------
    (?P<summary>.*)
    ^Game ended at: (?P<game_end>.*)$\
    '''
        pat = re.compile(pat_str, flags=re.MULTILINE|re.DOTALL)
        text = file_handle.read()
        for game in pat.finditer(text):
            yield game
    
    class Pokergame:
        def __init__(self, game_info, playername = 'Hero'):
            self.game_start = datetime.datetime.strptime(game_info['game_start'], "%Y/%m/%d %H:%M:%S")
            self.game_end = datetime.datetime.strptime(game_info['game_end'], "%Y/%m/%d %H:%M:%S")
            self.game_info = _parse_game(game_info['game'], playername)
            self.summary = _parse_summary(game_info['summary'], playername)
    
    def _parse_game(game_str, playername):
        pattern_seat = f'Seat (\d+): {playername} \((\d+)\).'
        seat_match = re.search(pattern=pattern_seat, string=game_str)
        if seat_match:
            seat, stack = seat_match.groups()
        pattern_cards = f'Player {playername} received card: \[(?P<card>\w+)\]'
        cards = tuple(i['card'] for i in re.finditer(pattern_cards, game_str))
    
        result = {
            'seat': seat,
            'stack': stack,
            'cards': cards,
            'text': game_str,
        }
        return result   
    
    def _parse_summary(summary_str, playername):
    
        return summary_str
    
    
    games = []
    with StringIO(hand_text) as file_handle:
        for game_info in split_file(file_handle):
            games.append(Pokergame(game_info))
    
    games[0].game_info
    
    {'cards': ('10c', '7h'),
     'seat': '3',
     'stack': '17595',
     'text': "Game ID: 1094127759 250/500 $5,000 GTD, ...\nPlayer Player4 mucks cards"}