在文件中找到模式匹配的第一个匹配项,然后停止遍历数据

2024-05-19 12:52:12 发布

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

我有一个文件有这样的数据

D11/22/1984 D 123 q423 ooo 11/22/1987
R11/22/1985 123 q423 ooo 11/22/1987
D12/24/1986 123 q423 ooo 11/22/1987
511/27/1987 123 q423 ooo 11/22/1987
D18/29/1988 123 q423 ooo 11/22/1987

我需要选取与模式^D(\d{2}/\d{2}/\d{4})匹配的第一个记录,然后中断并停止遍历文件的其余部分。在

例如,在上面提到的数据中,我只想选择值D11/22/1984,而不是D12/24/1986或{}。在

我想使用re模块用Python编写它。在


Tags: 模块文件数据re记录模式ooor11
3条回答

您可以像这样使用其余的数据

^D(\d{2}/\d{2}/\d{4})[\s\S]+

Demo

可以使用一个函数,该函数通过for循环迭代file对象,并在找到第一个匹配项时返回:

import re
def func():
    with open('/path/to/file.txt') as f: # Open the file (auto-close it too)
        for line in f: # Go through the lines one at a time
            m = re.match('D(\d{2}/\d{2}/\d{4})', line) # Check each line
            if m: # If we have a match...
                return m.group(1) # ...return the value

迭代一个file对象会产生一行一行的结果。所以,我们只检查尽可能多的线路。在

另外,我从模式中删除了^,因为默认情况下re.match已经与字符串的开头匹配。在


如果已经打开了一个file对象,只需删除with语句并将文件作为参数传递给函数:

^{pr2}$

当你处理完文件后,记得把它关上。在

您可以在文件obj上构建一个生成器(下面假设它名为f),它应用您的re.match,然后获取匹配项的第一个匹配项,例如:

matches = (re.match('D(\d{2}/\d{2}/\d{4})', line) for line in f)
first_match = next((match.group(1) for match in matches if match), None)

如果您得到None,则没有找到匹配项。您还可以扩展此功能,以便轻松获取n多个匹配项:

^{pr2}$

如果得到一个空列表,则找不到匹配项。在

相关问题 更多 >