Pop*_*lII 39 python regex split
我试图在一组有点不规则的数据上执行字符串拆分,看起来像:
\n\tName: John Smith
\n\t Home: Anytown USA
\n\t Phone: 555-555-555
\n\t Other Home: Somewhere Else
\n\t Notes: Other data
\n\tName: Jane Smith
\n\t Misc: Data with spaces
Run Code Online (Sandbox Code Playgroud)
我想把它转换成一个元组/字典,我后来将分裂在冒号上:,但首先我需要摆脱所有额外的空格.我猜一个正则表达式是最好的方法,但我似乎无法得到一个有效,下面是我的尝试.
data_string.split('\n\t *')
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 81
只需使用.strip(),它会在拆分时为您删除所有空格,包括制表符和换行符.然后可以通过以下方式完成拆分data_string.splitlines():
[s.strip() for s in data_string.splitlines()]
Run Code Online (Sandbox Code Playgroud)
输出:
>>> [s.strip() for s in data_string.splitlines()]
['Name: John Smith', 'Home: Anytown USA', 'Phone: 555-555-555', 'Other Home: Somewhere Else', 'Notes: Other data', 'Name: Jane Smith', 'Misc: Data with spaces']
Run Code Online (Sandbox Code Playgroud)
你现在甚至可以内联分裂::
>>> [s.strip().split(': ') for s in data_string.splitlines()]
[['Name', 'John Smith'], ['Home', 'Anytown USA'], ['Phone', '555-555-555'], ['Other Home', 'Somewhere Else'], ['Notes', 'Other data'], ['Name', 'Jane Smith'], ['Misc', 'Data with spaces']]
Run Code Online (Sandbox Code Playgroud)
>>> for line in s.splitlines():
... line = line.strip()
... if not line:continue
... ary.append(line.split(":"))
...
>>> ary
[['Name', ' John Smith'], ['Home', ' Anytown USA'], ['Misc', ' Data with spaces'
]]
>>> dict(ary)
{'Home': ' Anytown USA', 'Misc': ' Data with spaces', 'Name': ' John Smith'}
>>>
Run Code Online (Sandbox Code Playgroud)
你可以用一块正则石头杀死两只鸟:
>>> r = """
... \n\tName: John Smith
... \n\t Home: Anytown USA
... \n\t Phone: 555-555-555
... \n\t Other Home: Somewhere Else
... \n\t Notes: Other data
... \n\tName: Jane Smith
... \n\t Misc: Data with spaces
... """
>>> import re
>>> print re.findall(r'(\S[^:]+):\s*(.*\S)', r)
[('Name', 'John Smith'), ('Home', 'Anytown USA'), ('Phone', '555-555-555'), ('Other Home', 'Somewhere Else'), ('Notes', 'Other data'), ('Name', 'Jane Smith'), ('Misc', 'Data with spaces')]
>>>
Run Code Online (Sandbox Code Playgroud)
如果你看一下文件为str.split:
如果未指定 sep 或为 None ,则应用不同的拆分算法:将连续空格的运行视为单个分隔符,如果字符串有前导或尾随空格,则结果将在开头或结尾不包含空字符串。因此,拆分空字符串或仅由空格组成的字符串与 None 分隔符将返回 []。
换句话说,如果你想找出传递给split获得'\n\tName: Jane Smith'到['Name:', 'Jane', 'Smith'],仅仅通过什么(或无)。
这几乎可以解决您的整个问题。剩下两部分。
首先,您只有两个字段,其中第二个可以包含空格。所以,你只想要一个分割,而不是尽可能多的分割。所以:
s.split(None, 1)
Run Code Online (Sandbox Code Playgroud)
接下来,你仍然有那些讨厌的冒号。但是你不需要对它们进行拆分。至少鉴于您向我们展示的数据,冒号始终出现在第一个字段的末尾,前面没有空格,后面始终有空格,因此您可以将其删除:
key, value = s.split(None, 1)
key = key[:-1]
Run Code Online (Sandbox Code Playgroud)
当然,还有一百万种其他方法可以做到这一点;这只是似乎最接近您已经尝试的方法。