我有以下字符串
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(':')
但是,我想知道是否有一种方法可以同时拆分两个字符。
答案 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)