Python 3.x 正则表达式:在匹配后为行添加文本

Python 3.x 正则表达式:在匹配后为行添加文本,python-3.x,regex,Python 3.x,Regex,我正在处理一个文件,该文件在时间之后的下一行有时间和值。我可以将时间提取到一个列表中,但还需要获得下面这行的值。这将是一个时间/值对的列表 文件如下所示: 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 myfile =

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

文件如下所示:

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
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)
我用来获取时间的代码是:

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())
在哪里

我还希望获得创建时间/值对的下一行(空白、F或1)的值

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

您将如何做到这一点?

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

inp=“”上午10:30
F
上午10:40
上午10:50
F
上午11:00
1.
上午11:10
上午11:20
1.
上午11:30
1.
上午11:40
1"""
matches=re.findall(r'\b(\d{1,2}\:\d{2}\s?(?:AM | PM | AM | PM))\r?\n(\s*),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')]

您可以尝试以下方法:

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
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']]
解释

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

您还可以使其更具体一些,匹配一种类似时间的格式,后跟一个换行符,并可以选择使用字符类匹配F或1

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

  • \b
    单词边界
  • Capturegroup 1
    • (?:1[0-2]| 0?[1-9])
      将0-9与可选的前导0或10、11和12匹配
    • :[0-5][0-9]\s?
      从00-59匹配
    • (?:AM | PM | AM | PM)
      匹配一个备选方案
  • 关闭第1组
  • \r?\n
    匹配换行符
  • ([F1]?)
    捕获组2,可选择匹配F或1

请参见a和a。

该文件不是HTML文件。你为什么需要BeautifulSoup?你可以试试这个
time\u pattern=re.compile(r'(\d{1,2}:\d{2}\s?[AP]M)[\r\n]+([a-z\d]?),re.I)
你的问题有一些答案。我注意到你还没有接受你问题的答案。有什么原因吗?为了结束你的问题,我建议将其中一个答案标记为已接受,并希望你也能结束你提出的其他问题。张贴的任何答案都有效吗?