正则表达式:将数字与'#'配对 - 在字符串列表

时间:2015-08-21 16:49:22

标签: python regex parsing

所以我有一些文本行存储在列表中,如下所示:

lines = ['1.9 #comment 1.11* 1.5 # another comment',
         '1.23',
         '3.10.3* #commennnnnt 1.2 ']

我想创建:

[{'1.9': 'comment'},
 {'1.11*': ''},
 {'1.5': 'another comment'},
 {'1.23': ''},
 {'3.10.3*': 'commennnnnt'},
 {'1.2': ''} ]

换句话说,我希望将列表分开,并将每个十进制数与注释(以'#'开头;我们可以假设其中没有数字出现)配对,它出现在同一行之后,如果没有评论,则使用空字符串(例如,在它之后的下一个字符是另一个数字)。

具体来说,'十进制数'可以是一个数字,后跟一个点,然后是一个或两个数字,可选地后跟一个点和一个或两个以上的数字。最后可能会出现'*'。就像这样(?):r'\d\.\d{1,2}(\.\d{1,2})?\*?')

我已经尝试了re.split()的一些事情来开始。例如,在担心字典配对之前,将第一个列表项拆分为疯狂的十进制正则表达式或#

>>> crazy=r'\d\.\d{1,2}(\.\d{1,2})?\*?'

>>> re.split(r'({0})|#'.format(crazy), results[0])

结果:

[u'',
 u'1.9',
 None,
 u' ',
 None,
 None,
 u'comment ',
 u'1.11',
 None,
 u' ',
 u'1.5',
 None,
 u' ',
 None,
 None,
 u' test comment']

这看起来像我可以过滤和使用的东西,但有更好的方法吗? (另外,哇......似乎我疯狂的正则表达式中的括号允许我按照需要保留十进制数字分隔符!)

1 个答案:

答案 0 :(得分:1)

以下似乎有效:

lines = ['1.9 #comment 1.11* 1.5 # another comment',
         '1.23',
         '3.10.3* #commennnnnt 1.2 ']

entries =  re.findall(r'([0-9.]+\*?)\s+((?:[\# ])?[a-zA-Z ]*)', " ".join(lines))
ldict = [{k: v.strip(" #")} for k,v in entries]

print ldict

显示:

[{'1.9': 'comment'}, {'1.11*': ''}, {'1.5': 'another comment'}, {'1.23': ''}, {'3.10.3*': 'commennnnnt'}, {'1.2': ''}]