正则表达式中的条件匹配

Ran*_*Rag 4 python regex

我正在尝试从下面给出的字符串中提取一些信息

>>> st = '''
... <!-- info mp3 here -->
...                             192 kbps<br />2:41<br />3.71 mb  </div>
... <!-- info mp3 here -->
...                             3.49 mb  </div>
... <!-- info mp3 here -->
...                             128 kbps<br />3:31<br />3.3 mb   </div>
... '''
>>>
Run Code Online (Sandbox Code Playgroud)

现在当我使用下面的正则表达式我的输出是

>>> p = re.findall(r'<!-- info mp3 here -->\s+(.*?)<br />(.*?)<br />(.*?)\s+</div>',st)
>>> p
[('192 kbps', '2:41', '3.71 mb'), ('128 kbps', '3:31', '3.3 mb')]
Run Code Online (Sandbox Code Playgroud)

但我要求的输出是

[('192 kbps', '2:41', '3.71 mb'),(None,None,'3.49mb'), ('128 kbps', '3:31', '3.3 mb')]
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是如何更改我的上述内容regex以匹配所有条件.我相信我当前的正则表达式严格依赖于<br />标签,所以我如何使其成为条件.

我知道我不应该使用正则表达式来解析HTML,但目前这对我来说是最合适的方式.

Kar*_*mel 6

以下内容可行,但我想知道是否没有更优雅的解决方案.你当然可以将列表推导组合成一行,但我认为这会使代码总体上不那么清晰.至少通过这种方式,你可以跟随你从现在起三个月后所做的事情......

st = '''
<!-- info mp3 here -->
                            192 kbps<br />2:41<br />3.71 mb  </div>
<!-- info mp3 here -->
                            3.49 mb  </div>
<!-- info mp3 here -->
                            128 kbps<br />3:31<br />3.3 mb   </div>
'''

p = re.findall(r'<!-- info mp3 here -->\s+(.*?)\s+</div>',st)
p2 = [row.split('<br />') for row in p]
p3 = [[None]*(3 - len(row)) + row for row in p2]

>>> p3
[['192 kbps', '2:41', '3.71 mb'], [None, None, '3.49 mb'], ['128 kbps', '3:31', '3.3 mb']]
Run Code Online (Sandbox Code Playgroud)

并且,根据字符串的可变性,您可能希望编写一个更通用的清除函数,即条带,大小写等等,并将其映射到您提取的每个项目.