python re.findall不';不匹配重复项

python re.findall不';不匹配重复项,python,regex,findall,Python,Regex,Findall,假设输入是这样的。事实上它更长,但为了清楚起见,我将这样离开它 有效期:周三3月5日15:40:45格林威治标准时间+2014年00:00至:周四1月5日08:28:29格林威治标准时间+2034年00:00 有效期:2014年1月10日星期五08:28:29 GMT+00:00至:2014年1月5日星期四08:28:29 GMT+00:00 2034 这是我的密码: certDataArray = [] patterns = ['Alias name:\s(.*)\n

假设输入是这样的。事实上它更长,但为了清楚起见,我将这样离开它

有效期:周三3月5日15:40:45格林威治标准时间+2014年00:00至:周四1月5日08:28:29格林威治标准时间+2034年00:00 有效期:2014年1月10日星期五08:28:29 GMT+00:00至:2014年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将不匹配模式的第二个匹配项“直到:\s(.*)\n”,因为已经存在相同的匹配项。我不确定我的措辞是否正确,但你明白了

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

1) 使用新的改进的python正则表达式模块。这是不可能的,因为我没有在我的电脑上运行,这段代码将在企业级平台上运行。以任何方式升级python都是不可能的,我不认为我可以将paste regex.py复制到服务器中,让那边的python使用它,或者我可以吗?我下载了这个软件包,它似乎需要安装,我不允许在这个系统上进行安装

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

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


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

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

  • r“原始字符串”
    以防止逃逸出错
  • 正则表达式字符串结尾标记
    $
    而不是
    \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
,则返回到一个结果。哦,对了。在最后一行中,没有匹配项,因为该行的结尾没有匹配$的内容。你救了我至少一天的工作。谢谢!