将多个正则表达式匹配附加到列表列表

Posted

技术标签:

【中文标题】将多个正则表达式匹配附加到列表列表【英文标题】:Appending Multiple Regex Matches to a List of Lists 【发布时间】:2021-06-02 01:27:09 【问题描述】:
txt = '0    Marriage of MARY ROCHE
1   in 1880
2   Group Registration ID\tN/R
3   SR District/Reg Area\tCork
4   Returns Year\t1880
5   Returns Quarter\t4
6   Returns Volume No\t5
7   Returns Page No\t0110
8   Marriage of MARY ROCHE
9   in 1880
10  Group Registration ID\tN/R
11  SR District/Reg Area\tEnniscorthy
12  Returns Year\t1880
13  Returns Quarter\t3
14  Returns Volume No\t4
15  Returns Page No\t276"

以上是婚姻记录数据集的 sn-p。每 8 行对应一个新女性的记录。我正在尝试通过正则表达式提取关键细节(年份、地区、季度、卷、页码)。

 year = re.compile(r'in\s\d4')
area = re.compile(r'Area\t[A-Za-z]+(?:\s[A-Za-z]+)*$')
fdata = []
file = open('C:\\Downloads\\mary_roche.txt', 'r')
for line in file:
    year_matches = year.finditer(line)
    area_matches = area.finditer(line)
    for a in area_matches:
        for y in year_matches:
            fdata.append([y.group(),a.group()])
   
    
print(len(fdata))
print(fdata)

当我单独使用这些表达式时,它们会起作用,但是当我尝试将这两个表达式添加到列表列表时,我什么也得不到。我的最终目标是为所有五个关键细节创建表达式并以有序的方式存储它们,即 [[woman1]、[woman2]、[woman3]...等]

非常感谢这里的任何帮助。 干杯!

【问题讨论】:

【参考方案1】:

for 循环的逻辑只有两个怪癖。

您尝试了每一行的匹配项,但由于没有包含区域和年份的单行,所以您什么也得不到。补救措施:只需对整个数据集进行操作即可。 你会为一个区域迭代所有年份;这样,在第一个找到的区域之后,所有年份的匹配都会被消耗掉。补救措施:对于每个区域,只能获得一年匹配。
area = re.compile(r'Area\t[A-Za-z]+(?:\s[A-Za-z]+)*$', re.M)
…
file = open('C:\\Downloads\\mary_roche.txt', 'r').read()
year_matches = year.finditer(file)
area_matches = area.finditer(file)
for a in area_matches:
    y = next(year_matches)
    fdata.append([y.group(), a.group()])

请注意,我们需要 re.MULTILINE 标志和 $,因为 file 字符串现在有多行。

当然我们可以缩短这个,直接写:

fdata = [*zip(year.findall(file), area.findall(file))]

【讨论】:

以上是关于将多个正则表达式匹配附加到列表列表的主要内容,如果未能解决你的问题,请参考以下文章

检查列表是不是有一个或多个与正则表达式匹配的字符串

正则表达式匹配两个或多个逗号分隔的整数

如何匹配plsql中正则表达式中的列表/数组?

将文本附加到正则表达式匹配的一部分

将正则表达式匹配转换为字符串列表

正则表达式语法