将多个正则表达式匹配附加到列表列表
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))]
【讨论】:
以上是关于将多个正则表达式匹配附加到列表列表的主要内容,如果未能解决你的问题,请参考以下文章