在字符串中的关键字之前删除“ \ n”

时间:2019-12-11 16:49:36

标签: python regex pandas dictionary

我有以下字符串:

rake

我想动态分割线以得到如下所示的字典形状:

elements = "one: Fire \n two: Water \n three: Earth \n four: \n Sky \n five: \n Light \n"

我可以使用{one: Fire, two: Water, three: Earth, four: Sky, five: Light} 在前三个元素中执行此操作,因为信息包含在新行拆分之前。 但是,对于“四个:”和“五个:”,在元素之前有一个“ \ n”,而我无法提取该元素。

有没有办法动态地做到这一点?

我能想到的唯一解决方案是在元素词列表之前过滤“ \ n”。

2 个答案:

答案 0 :(得分:2)

您可能不需要复杂的正则表达式即可。您可以尝试一下

str = 'one: Fire \n two: Water \n three: Earth \n four: \n Sky \n five: \n Light \n'
str = str.replace(' ', '').replace(':\n', ':')
parts = filter(lambda x: ':' in x, str.split('\n'))
elements = dict((elem.split(':')) for elem in parts)
print(elements)

但是如果您真的想花哨的话,这也可以

import re
str = 'one: Fire \n two: Water \n three: Earth \n four: \n Sky \n five: \n Light \n'
parts = map(lambda x: re.sub('\s', '', x), re.findall('\w+:\s*\w+', str))
elements = dict((elem.split(':')) for elem in parts)
print(elements)

答案 1 :(得分:1)

也许有更简洁的方法,但是您可以这样做:

re.findall(r".*: [a-zA-Z\s]+ \n", elements)

获取所有您的元素。

要使其成为字典,您可以执行以下操作:

split_elems = re.findall(r".*: [a-zA-Z\s]+ \n", elements)
stripped_elems = [elem.strip() for elem in split_elems]
dict((elem.split(':')) for elem in stripped_elems)

或者,正如@ eva-vw指出的,如果要从值中删除空格,可以执行以下操作:

{elem.split(':')[0]: elem.split(':')[1].strip() for elem in stripped_elems}