首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从重复的多行文件中获取模式

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

Stack Overflow用户
提问于 2019-02-12 14:11:20
回答 1查看 72关注 0票数 0

我试图从文本文件中生成Dataframe。我正在使用我在互联网上找到的代码,但是我被困住了,我不知道如何前进。

PokerStars Hand #135139509095:不限(0.25美元/0.50美元)- 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:褶皱 蒂戈西德尼:从1美元到1.5美元 parisvii1986:褶皱 Johnii141:褶皱 DavidRandis:拨打1美元 * FLOP * Jd 9c Tc *转* Jd 9c Tc *摘要* 大麻3.75美元Rake 0.17美元 Jd 9c Tc 4s板 座位5:收取DavidRandis (3.58美元) PokerStars Hand #135139512060:不限(0.25美元/0.50美元)- 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美元- Rake 0.12美元 板7h Td Jc 座位1: Johnii141 (大盲)在滑倒前折叠 座位2:收取MASSOS17 (2.63美元) 座位4: jayceee16折叠在滑梯上 座位5: Mastiksou855 (按钮)在失败前折叠(没有下注) 座位6: malabar357 (小瞎子)在滑倒前折叠

这不是完全的扑克手。只要粘贴在这里,两个扑克手作为例子,向你展示它的样子。完整的五个扑克手示例被上传到这里:https://ufile.io/y573n

代码语言:javascript
运行
复制
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信息(最后一行之一)。

我不知道如何跨越所有的线。

如果得到值,将其保存到dataframe,如果模式不匹配,则保存None。对于每一个角手,我想要一行数据,如下所示:http://prntscr.com/mk2y4t

EN

回答 1

Stack Overflow用户

发布于 2019-02-13 09:44:25

您需要将regexpandas结合使用。

代码语言:javascript
运行
复制
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)

你会得到:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54651971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档