使用通配符/模式解析Python中的文本文档行

2024-05-16 14:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我所拥有的

我正在分析一个.txt文件,该文件包含了某一天谁工作的日程安排信息。.txt文件如下所示:

START PAGE 0

XYZ Schedule for:  Saturday, March 30, 2013

Barnes, Michael8:00a10:00aTech

Collins, Jessica8:00a4:00pSupervisor

Hamilton, Patricia8:00a10:00aTech

Smith, Jan8:00a10:00aTech

Park, Kimberly8:00a10:00aTech

Edwards, Terrell10:00a12:00pTech

Green, Harrold12:00p2:00pTech

Tait, Jessica12:00p2:00pTech

Tait, Jessica2:00p4:00pTech

Hernandez, William (Monte)4:00p6:30pSupervisor

Tait, Chioma4:00p6:00pTech

Hernandez, William (Monte)6:30p7:00pSupervisor

Hernandez, William (Monte)7:00p9:00pSupervisor

Tailor, Thomas (Jason)9:00p12:00aSupervisor

Jones, Deslynne10:00p12:00aTech

3/28/2013 2:21:17 PM

END PAGE 0

所以前两行和最后两行并不相关,但中间的每一行都是一个人的日程安排。在

我想要什么

我想解析出每一行的片段,这样我就可以把它写到一个.csv文件中。我可以使用line.partition(',')[0]来获得姓氏(每行的第一个部分),但是在那之后我就不知所措了。我需要将以下内容传达给Python:

  1. 数字的,后面的部分是一个部分(第一个 名称)
  2. 从第一个数到ap的部分 (对于am或pm)是另一个部分(开始时间)
  3. 来自 紧随其后的a或{}到下一个a或{}是另一个 段(结束时间)
  4. 最后,剩下的部分是另一部分 区段(轮班的类型/位置。)

我得到的csv文件中的一行可能如下所示: Barnes,Michael,8:00a,10:00a,Tech

注意事项

1)一个人一天可以有多个班次。 2) 有些人在括号里有一个昵称,但有些人没有。 3) 如果Python对一个数字有#*之类的通配符,那么我可以看到如何继续使用partition并继续拆分剩余的部分,如下所示:

^{pr2}$

然而,Python似乎没有使用这样的通配符。而且,这似乎是一个非常不雅观的解决方案。在


Tags: 文件csvtxt信息时间page数字start
2条回答

假设您知道如何删除前两行和最后两行,剩下的行在一个名为s的字符串中,下面是我将如何做您想要的:

entries = [x.strip() for x in s.split('\n') if x]

for entry in entries:
    ind = [i for i,x in enumerate(entry) if x.isdigit() and not entry[i-1].isdigit()]
    name = entry[0:ind[0]]
    name = name.split(',')

    other = entry[ind[0]:]
    ind = [-1]+[i for i,x in enumerate(other) if x in ('a', 'p') and other[i-1].isdigit()]
    shifts = []
    for i in xrange(1, len(ind)):
        shifts.append(other[ind[i-1]+1:ind[i]+1])
    position = other[ind[-1]+1:]
    print(name, shifts, position)

这将适用于任意数量的轮班。在

输出:

^{pr2}$

这足以让你开始:

import re
data = '''Barnes, Michael8:00a10:00aTech
Collins, Jessica8:00a4:00pSupervisor
Hamilton, Patricia8:00a10:00aTech
Smith, Jan8:00a10:00aTech
Park, Kimberly8:00a10:00aTech
Edwards, Terrell10:00a12:00pTech
Green, Harrold12:00p2:00pTech
Tait, Jessica12:00p2:00pTech
Tait, Jessica2:00p4:00pTech
Hernandez, William (Monte)4:00p6:30pSupervisor
Tait, Chioma4:00p6:00pTech
Hernandez, William (Monte)6:30p7:00pSupervisor
Hernandez, William (Monte)7:00p9:00pSupervisor
Tailor, Thomas (Jason)9:00p12:00aSupervisor
Jones, Deslynne10:00p12:00aTech'''

print re.findall(r'(.*?)(\d{1,2}:\d\d[ap])(\d{1,2}:\d\d[ap])(.*)', data)

印刷品

^{pr2}$

阅读re模块的文档以了解正则表达式。您可以将名称解析为一个单独的步骤,或者扩展正则表达式以更具体。我建议使用csv模块写入csv文件。在

如果你卡住了,用代码贴出具体的问题。在

相关问题 更多 >