【问题标题】:Splitting a string by multiple possible delimiters通过多个可能的分隔符拆分字符串
【发布时间】:2021-05-19 15:25:47
【问题描述】:

我想将str 解析为float 值列表,但是我想灵活地处理我的分隔符。具体来说,我希望能够使用其中任何一个

s = '3.14; 42.2'  # delimiter is '; '
s = '3.14;42.2'   # delimiter is ';'
s = '3.14, 42.2'  # delimiter is ', '
s = '3.14,42.2'   # delimiter is ','
s = '3.14 42.2'   # delimiter is ' '

我想过删除所有空格,但这会禁用最后一个版本;我通过执行re.split('[;, ]', s) 尝试了re.split()-function,它可以使用单个字符作为分隔符,但否则会失败。

我可以做

s.replace('; ', ';').replace(', ', ';').replace(',', ';').replace(' ', ';')
s.split(';')

这可行,但似乎不是一个好的做法或有用的 - 特别是如果我将来会添加更多分隔符。有什么好的方法可以做到这一点?

【问题讨论】:

  • 如果你写了一个将分隔符作为参数的函数呢?

标签: python string split delimiter


【解决方案1】:

您可以使用 re.split 和 split on([ ] 是空格,括号仅用于显示)

[;,] ?|[ ]

模式匹配

  • [;,] ? 匹配 ;, 后跟可选空格
  • |
  • [ ]匹配单个空格

Regex demo | Python demo

更严格的环视模式可能是使用环视断言左侧的数字。

(?<=\d)(?:[;,] ?| )(?=\d)

模式匹配:

  • (?&lt;=\d) 正向向后看,向左断言一个数字
  • (?: 交替的非捕获组
    • [;,] ? 匹配 ;, 后跟可选空格
    • |或者
    • 匹配一个空格
  • )关闭非捕获组
  • (?=\d) 正向前瞻,向右断言一个数字

Regex demo

示例代码

import re

strings = [
    "3.14; 42.2",
    "3.14;42.2",
    "3.14, 42.2",
    "3.14,42.2",
    "3.14 42.2"
]

for s in strings:
    print(re.split(r"[;,] ?| ", s))

输出

['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']
['3.14', '42.2']

【讨论】:

    【解决方案2】:

    我认为您可以像这样解释最后一个空格:

    re.split(r'[;,]\s*', s)
    

    这里\s* 将捕获分隔符后的空格,如果有的话。

    【讨论】:

      【解决方案3】:

      也可以这样做:

      res = re.split('; |;|,|, | ', data)
      

      https://www.geeksforgeeks.org/python-split-multiple-characters-from-string/

      【讨论】:

        【解决方案4】:

        假设您提前知道输入的分隔符,您可以编写一个函数,将分隔符作为参数,替换为空格,然后将其拆分:

        def split_on_delim(strng, delim):
            return strng.replace(delim, ' ').split()
        

        例如:

        >>> s = '3.14; 42.2'
        >>> split_on_delim(s, '; ')
        ['3.14', '42.2']
        

        【讨论】:

          猜你喜欢
          • 2013-10-30
          • 1970-01-01
          • 2017-03-21
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 2014-03-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多