拆分带有两个不同字符的字符串

时间:2015-02-12 22:24:25

标签: python regex string-split

我有以下字符串

u'root\n |-- date: string (nullable = true)\n |-- zip: string (nullable = true)\n' 

我想提取列名。列名称前面有|--,后面有:

我可以分两个阶段做到这一点:

s = u'root\n |-- date: string (nullable = true)\n |-- zip: string (nullable = true)\n' 
s = s.split('|-- ')
s = s.split(':')

但是,我想知道是否有一种方法可以同时拆分两个字符。

3 个答案:

答案 0 :(得分:3)

您可以使用re.findall同时获取它们:

>>> import re
>>> data = u'root\n |-- date: string (nullable = true)\n |-- zip: string (nullable = true)\n'
>>> re.findall(r'\|--\s(\w+):', data)
['date', 'zip']
>>>

以下是使用的正则表达式模式的解释:

\|--   # Matches |--
\s     # Matches a whitespace character
(\w+)  # Capture group for one or more word characters
:      # Matches :

答案 1 :(得分:3)

如果您只想分割名称然后提取效率低于仅仅使用findall,请使用findall而不是拆分:

所以基于我想提取列名。列名在它们之前有| - 并且在它们之后:

import re

s = u'root\n |-- date: string (nullable = true)\n |-- zip: string (nullable = true)\n'
print(re.findall(r"\|--\s+(.*?):",s))
['date', 'zip']

或使用re.compile

patt = re.compile(r"\|--\s+(.*?):")
patt.findall(s)
['date', 'zip']

无法使用两个分隔符str.split进行分割。

如果您使用str.split,您可以执行以下操作:

print([x.split(":")[0] for x in s.split("|-- ")[1:]])
['date', 'zip']

在初始拆分后,子拆分中的第一个元素将始终是具有:的元素,但如果您在其他地方有任何其他|--未包含您想要的数据,则此方法会中断。

答案 2 :(得分:3)

  

但是,我想知道是否有一种方法可以同时拆分两个字符。

可以使用re#split

re.split(r'\|--|:', your_string)