【问题标题】:python re.findall doesn't match duplicatespython re.findall 不匹配重复项
【发布时间】:2014-09-03 15:20:22
【问题描述】:

假设输入是这样的。实际上它更长,但为了清楚起见,我将其保留为这样。

有效期:2014 年 3 月 5 日星期三 15:40:45 GMT+00:00 至:1 月 5 日星期四 08:28:29 GMT+00:00 2034
有效期从:2014 年 1 月 10 日星期五 08:28:29 GMT+00:00 到:1 月 5 日星期四 08:28:29 GMT+00:00 2034

这是我的代码:

 certDataArray = []
            patterns = ['Alias name:\s(.*)\n', 'Owner:\s(.*)\n', 'Issuer:\s(.*)\n', 'Serial number:\s(.*)\n', 'Valid from:\s(.*) until', 'until:\s(.*)\n']
            for pattern in patterns:
                result = re.compile(pattern)
                result = result.findall(cmd)
                certDataArray.append(result)
            certDataArray = zip(certDataArray[0],certDataArray[1],certDataArray[2],certDataArray[3],certDataArray[4],certDataArray[5])

现在,问题是 findall 不会匹配模式 "until:\s(.*)\n" 的第二个匹配项,因为已经有一个相同的匹配项。不确定我的措辞是否正确,但你明白了。

我一直在谷歌搜索解决方案,发现 2:

1) 使用新改进的python regex 模块。这不在桌面上,因为我没有在我的 PC 上运行它,这段代码将在企业级平台上运行。以任何方式升级 python 是不可能的,我不认为我可以将 regex.py 复制粘贴到服务器中以使那里的 python 使用它,或者我可以吗?我下载了这个包,好像需要安装,这个系统不允许我安装。

2) 重复。一直在看,坦率地说我不明白它是如何工作的

我也尝试将字符串分解成行并使用“for”循环遍历每一行,但这似乎是一种可能适得其反的迟钝方法。

非常欢迎所有想法,谢谢。

【问题讨论】:

    标签: python regex findall


    【解决方案1】:

    这不是因为它是重复匹配 - 第二行'\n' 结尾。你真的应该使用:

    • r"raw strings" 防止逃逸搞砸;
    • 正则表达式字符串结束标记$ 而不是\n;和
    • re.MULTILINE 选项分别处理每一行。

    例如:

    >>> s = """Valid from: Wed Mar 05 15:40:45 GMT+00:00 2014 until: Thu Jan 05 08:28:29 GMT+00:00 2034
    Valid from: Fri Jan 10 08:28:29 GMT+00:00 2014 until: Thu Jan 05 08:28:29 GMT+00:00 2034"""
    >>> import re
    >>> re.findall(r'until:\s(.*)$', s, re.MULTILINE)
    ['Thu Jan 05 08:28:29 GMT+00:00 2034', 'Thu Jan 05 08:28:29 GMT+00:00 2034']
    

    【讨论】:

    • 是的,如果 re.MULTILINE 被添加到 re.compile(pattern, re.MULTILINE) 中,并且使用 $ 代替 \n,那么它可以工作。但是,我仍然不完全理解 multiline 的作用。你可以解释吗?另外,什么时候需要在图案前面加上字母“r”,什么时候不需要?
    • 我不明白为什么在这种情况下我需要单独处理每一行,如果我尝试匹配的模式没有在多行上运行,它不会从一个开始,并在另一行结束。
    • 是的,但是你想匹配字符串的结尾或者一行的结尾使用$,如果你不使用re.MULTILINE那只有匹配字符串的结尾,因此您将返回一个结果。
    • 哦,对了。在最后一行中,没有任何内容可以匹配,因为该行没有以任何与 $ 匹配的内容结尾。您刚刚使我免于重写至少 1 天的工作。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多