Python 正则表达式:将数字与'配对#'-字符串列表中前面的注释
因此,我有一些文本行存储在一个列表中,如下所示:Python 正则表达式:将数字与'配对#'-字符串列表中前面的注释,python,regex,parsing,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'},
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()
开始的方法。例如,在担心dict对之前,拆分疯狂十进制正则表达式或#
上的第一个列表项:
>>> 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']
这看起来像是我可以过滤和处理的东西,但是有更好的方法吗?(还有,哇……我疯狂的正则表达式中的括号似乎允许我根据需要保留十进制数字分隔符!)以下内容似乎有效:
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': ''}]