【问题标题】:Regex: Text the line after a match正则表达式:匹配后的文本行
【发布时间】:2021-02-14 18:27:40
【问题描述】:

我正在处理一个文件,该文件在时间之后的下一行包含时间和值。我可以将时间提取到列表中,但还需要获取以下行的值。这将是时间/值对的列表。

文件如下所示:

10:30 AM
F
10:40 AM

10:50 AM
F
11:00 AM
1
11:10 AM

11:20 AM
1
11:30 AM
1
11:40 AM
1
11:50 AM
1
12:00 PM

12:10 PM
1
12:20 PM
1
12:30 PM
1
12:40 PM
1
12:50 PM
1

我用来获取时间的代码是这样的:

get_source = driver.page_source  
soup = BeautifulSoup(get_source, 'html.parser')
time_pattern = re.compile(r'\s(\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))')
times = time_pattern.findall(soup.get_text())

在哪里

times = ['10:30 AM', '10:40 AM', '10:50 AM', '11:00 AM'........]

我还想获取下一行的值(空白、F 或 1)创建时间/值对。

timesvaluepair = [[10:30 AM, 'F'],[10:40 AM, ''],[10:50 AM, 'F'],[11:00 AM, '1'],.........]

你会怎么做?

【问题讨论】:

  • 该文件不是 HTML 文件。为什么需要 BeautifulSoup?
  • 你可以试试这个time_pattern = re.compile(r'(\d{1,2}:\d{2}\s?[AP]M)[\r\n]+([a-z\d]?)', re.I)
  • 您的问题有几个答案。我注意到您尚未接受问题的答案。有什么理由吗?为了结束您的问题,我建议您将其中一个答案标记为已接受,并希望您也可以结束您提出的其他问题。
  • 张贴的答案是否有效?

标签: python-3.x regex


【解决方案1】:

您只需稍微修改当前的正则表达式即可在单独的捕获组中捕获时间和值:

inp = """10:30 AM
F
10:40 AM

10:50 AM
F
11:00 AM
1
11:10 AM

11:20 AM
1
11:30 AM
1
11:40 AM
1"""

matches = re.findall(r'\b(\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))\r?\n(\S*)', inp)
print(matches)

打印出来:

[('10:30 AM', 'F'), ('10:40 AM', ''),  ('10:50 AM', 'F'), ('11:00 AM', '1'),
 ('11:10 AM', ''),  ('11:20 AM', '1'), ('11:30 AM', '1'), ('11:40 AM', '1')]

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    myfile = open('test.txt', 'r')
    lines = myfile.readlines()
    
    dataset = []
    item = []
    for line in lines:
    
        line = line.strip()
    
        if ':' in line:
            if len(item) > 0:
                dataset.append(item)
                item = []
    
        item.append(line)
    
    dataset.append(item)
    
    print(dataset)
    

    结果

    [['10:30 AM', 'F'], ['10:40 AM', ''], ['10:50 AM', 'F'], ['11:00 AM', '1'], ['11:10 AM', ''], ['11:20 AM', '1'], ['11:30 AM', '1'], ['11:40 AM', '1'], ['11:50 AM', '1'], ['12:00 PM', ''], ['12:10 PM', '1'], ['12:20 PM', '1'], ['12:30 PM', '1'], ['12:40 PM', '1'], ['12:50 PM', '1']]
    

    解释

    • 数据集是您的最终配对列表
    • item 是时间及其下一行的对
    • 我们从文件中读取所有行
    • 我们从带有strip() 的行中删除\n
    • 如果行中有:,我们检查项目中是否有东西
      • 如果有,则表示项目已经有一对,应该将这对添加到数据集中
      • 清空项目
    • 将该行添加回项目
    • 继续这样做,直到你到达终点;最后将项目添加回数据集

    【讨论】:

      【解决方案3】:

      你也可以让它更具体一点,匹配一个类似时间的格式,后跟一个换行符,并且可以选择使用字符类匹配 F 或 1。

      \b((?:1[0-2]|0?[1-9]):[0-5][0-9]\s?(?:AM|PM|am|pm))\r?\n([F1]?)
      

      说明

      • \b一个字边界
      • ( 捕获第 1 组
        • (?:1[0-2]|0?[1-9]) 匹配 0-9 和可选的前导 0 或 10、11 12
        • :[0-5][0-9]\s? 匹配从 00 - 59
        • (?:AM|PM|am|pm) 匹配其中一个选项
      • )关闭第一组
      • \r?\n 匹配换行符
      • ([F1]?) 捕获组 2,可选择匹配 F 或 1

      查看regex demoPython demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        相关资源
        最近更新 更多