【问题标题】:Splitting a string with two different characters用两个不同的字符分割一个字符串
【发布时间】:2015-04-13 20:54:26
【问题描述】:

我有以下字符串

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(':')

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

【问题讨论】:

  • 如果您只需要名称就使用 findall,您正在做不必要的工作拆分

标签: python regex string-split


【解决方案1】:

如果您只想将名称拆分然后提取,则使用 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']

在初始拆分后,子拆分中的第一个元素将始终是带有: 的元素,但如果您在其他地方有任何其他|-- 不是您想要的周围数据,这种方法就会中断。

【讨论】:

  • 你的方法解决了我的问题。我想我应该用不同的方式表达我的问题
  • @Michal,对我来说,您似乎很明显只想得到我认为 split 的名字,因为您尝试了 str.split ,这是一种可以理解的方法。
【解决方案2】:

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

可以使用re#split:

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

【讨论】:

  • 当 OP 想要提取的只是名称时,为什么要使用 split?
  • @PadraicCunningham 这是他最初的问题:“我想知道有没有办法同时用两个字符分割。”
  • 我想提取列名。列名前面有 |-- 后面有 :。
  • 虽然不错! +1
  • 我只想要名字,但我目前的情况让我以更一般的方式思考这个问题。就我而言,也许只是分裂对我没有多大帮助,因为那时我会失去名字。我只需要两个符号组合之间的字符。
【解决方案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 :

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2018-07-30
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多