【问题标题】:How to get patterns from repeated multiple lines files如何从重复的多行文件中获取模式
【发布时间】:2019-07-06 05:04:20
【问题描述】:

我尝试从文本文件制作数据框。我正在使用我在 Internet 上找到的代码,但我没有卡住,我不知道如何继续前进。

PokerStars 手牌 #135139509095:德州扑克无限注 ($0.25/$0.50 USD) - 2015/05/13 2:26:41 ET

表“Castafiore II”最多 6 人座位 #2 是按钮

座位 1:Mastiksou855(筹码 50 美元)

座位 2:tiagosydney(筹码 67.98 美元)

座位 3:parisvii1986(筹码 49.94 美元)

座位 4:Johnii141(筹码 50 美元)

座位 5:DavidRandis(筹码 36.59 美元)

6 号座位:malabar357(筹码 50 美元)

* 底牌 *

DavidRandis:跟注 $0.50

malabar357:折叠

Mastiksou855:折叠

tiagosydney:筹集 1 美元至 1.50 美元

parisvii1986:折叠

Johnii141:折叠

DavidRandis:跟注 $1

* FLOP * [Jd 9c Tc]

* TURN * [Jd 9c Tc] [4s]

* 总结 *

总底池 $3.75 |抽水 $0.17

板子 [Jd 9c Tc 4s]

第 5 位:DavidRandis 被收取(3.58 美元)

PokerStars 手牌 #135139512060:德州扑克无限注 ($0.25/$0.50 USD) - 2015/05/13 2:26:52 ET

表“Artek II”最多 6 人座位 #5 是按钮

座位 1:Johnii141(筹码 50 美元)

座位 2:MASSOS17(筹码 40 美元)

座位 4:jayceee16(筹码 53.21 美元)

座位 5:Mastiksou855(筹码 50 美元)

6 号座位:malabar357(筹码 50 美元)

malabar357:发布小盲注 $0.25

* 底牌 *

* 总结 *

总底池 $2.75 |抽水 $0.12

板 [7h Td Jc]

座位 1:Johnii141(大盲注)在翻牌前弃牌

座位 2:收集到 MASSOS17 ($2.63)

座位 4:jayceee16 在翻牌上折叠

Seat 5:Mastiksou855(按钮)在翻牌前弃牌(没有下注)

座位 6:malabar357(小盲注)在翻牌前弃牌

这不是满手牌。只需在此处粘贴 2 手牌作为示例,向您展示它的外观。 完整的五手牌示例在此处上传:https://ufile.io/y573n

def parse_file(line):
    tab1 = []
    with open(filepath,'r') as file:
        line = file.readline()
        while line:
            reg_match = _reglib(line)

            if reg_match.soft:
                soft = reg_match.soft.group()

            if reg_match.hand_id:
                hand_id = reg_match.hand_id.group(1)

            if reg_match.game_type:
                game_type = reg_match.game_type.group()

            if reg_match.sb:
                sb = reg_match.sb.group(1)

            if reg_match.bb:
                bb = reg_match.bb.group(1)

            if reg_match.date:
                date = reg_match.date.group(1)
                hour = reg_match.date.group(2)
                date_type = reg_match.date.group(3)
            line = file.readline()    
            if reg_match.table:
                table = reg_match.table.group(1)

            if reg_match.rake:
                rake = reg_match.rake.group(1)

            dict_of_data ={
                    'Soft' :soft,
                    'Hand_ID': hand_id,
                    'Game_type':game_type,
                    'SB':sb,
                    'BB':bb,
                    'Date':date,
                    'Hour':hour,
                    'Date_type':date_type,
                    'Table':table,
                    'Rake':rake
                    }
            tab1.append(dict_of_data)
            line = file.readline()        

    tab1 = pd.DataFrame(tab1)
    tab1.set_index(['Soft', 'Hand_ID', 'Game_type'], inplace=True)
    tab1 = tab1.groupby(level=tab1.index.names).first()


    return tab1


class _reglib:

    pat_soft = re.compile('Poker\w+')
    pat_hand_id = re.compile(r'#(\d+):')
    pat_game_type = re.compile('Hold\'em\s\w+\s\w+')
    pat_sb = re.compile('\$(\d+\.?\d+)/')
    pat_bb = re.compile('/\$(\d+\.?\d+)\s\w+')
    pat_date = re.compile('(\d+/\d+/\d+)\s(\d+:\d+:\d+)\s(C?ET)')
    pat_table = re.compile('Table\s\'(\w+...)\'')
    pat_seat = re.compile('(Seat\s\d):\s(\w+)\s\(\$')
    pat_rake = re.compile('Rake\s\$(...)')

    def __init__(self, line):
        # check whether line has a positive match with all of the regular expressions
        self.soft = self.pat_soft.search(line)
        self.hand_id = self.pat_hand_id.search(line)
        self.game_type = self.pat_game_type.search(line)
        self.sb = self.pat_sb.search(line)
        self.bb = self.pat_bb.search(line)
        self.date = self.pat_date.search(line)
        self.table = self.pat_table.search(line)
        self.seat = self.pat_seat.search(line)
        self.rake = self.pat_rake.search(line)


if __name__ == '__main__':
    filepath = 'test.txt'
    tab1 = parse_file(filepath)
    print(tab1)

所以当我在第二行搜索模式时问题就开始了,依此类推。 这是表信息(第二行)和 rake 信息(最后一行)。

我不知道如何遍历所有行。

如果我得到值,如果模式不匹配,则将其保存到数据框中保存无。 对于每个扑克手,我都希望数据框中有这样的一行:http://prntscr.com/mk2y4t

【问题讨论】:

    标签: python parsing text readlines


    【解决方案1】:

    您需要将regexpandas 一起使用:

    import re
    import pandas as pd
    
    data_pd = {'TypeOfRoom': [], 'HandId': [], 'TypeOfGame': [], 'SB': [], 'BB': [], 'Date': [], 'Hour': [], 'TimeZoneAbb': [], 'NoOfPlayers': [], 'Rake': []}
    with open('file.txt', 'r') as f:
        data = f.read()
    result = re.findall('(\w+) Hand #(\d+): (.*) \(.(\d+\.\d+)\/.(\d+\.\d+).*(\d\d\d\d\/\d\d\/\d\d).*(\d+:\d+:\d+) (\w+)', data)
    rakes = re.findall('Rake \$(.*)', data)
    
    s = re.findall('Seat (\d).*chips', data)
    s = [int(x) for x in s]
    seats = []
    length = 1
    for i in range(len(s)-1):
        if s[i+1] < s[i]:
            seats.append(length)
            length = 1
        else:
            length += 1
    seats.append(length)
    
    for r, rake, seat in zip(result, rakes, seats):
        data_pd['TypeOfRoom'].append(r[0])
        data_pd['HandId'].append(r[1])
        data_pd['TypeOfGame'].append(r[2])
        data_pd['SB'].append(r[3])
        data_pd['BB'].append(r[4])
        data_pd['Date'].append(r[5])
        data_pd['Hour'].append(r[6])
        data_pd['TimeZoneAbb'].append(r[7])
        data_pd['NoOfPlayers'].append(seat)
        data_pd['Rake'].append(rake)
    
    df = pd.DataFrame(data_pd)
    

    你会得到:

    【讨论】:

    • 好的,非常感谢你,但我发现这些方法存在一些问题。首先,nr 玩家必须从座位 1、座位 2 等线路中取出,因为桌子最多可以容纳 6 人,但例如可能会占用 4 个座位或 5 个座位​​。其次,它没有解决如何搜索其他行以从摘要下的行中获取例如 rake?不同的手到SUMMARY的行数可能不同,因此我们不能使用'\n.+',因为我们无法计算需要跳过多少行。这对我来说非常重要,因为我需要从不同的文本行中制作更多的 DataFrame。
    • 我已经添加了:1) Seat 通过线座位 1、座位 2 等计算 2) Rake 解析。查看我的更新答案
    • 感谢奥尔德文的回答。我相信它会帮助我。我自己也在用几乎没有什么不同的方法进行编码,但是我对并不总是存在的信息还有一个问题。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2018-07-16
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多