如何从重复的多行文件中获取模式

时间:2019-02-12 14:11:20

标签: python parsing text readlines

我尝试从文本文件制作Dataframe。我使用的是我在Internet上找到的代码,但卡住了一点,而且我不知道该如何前进。

  

PokerStars Hand#135139509095:Hold'em No Limit($ 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 Hand#135139512060:Hold'em No Limit($ 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在翻牌圈折叠了

     

第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)

因此,当我在第二行中搜索模式等时,问题就开始了。 这是表信息(第二行)和瑞克信息(最后一行之一)。

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

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

1 个答案:

答案 0 :(得分:0)

您需要将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)

您将获得:

enter image description here