用多个可能的分隔符拆分字符串

Splitting a string by multiple possible delimiters

我想将 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()-函数,它可以使用单个字符作为分隔符,但否则会失败。

不过我可以

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

这有效,但似乎不是一个好的做法或有用的 - 特别是如果我将来添加更多的分隔符。执行此操作的好方法是什么?

可以用re.split拆分([ ]是一个space,中括号只是为了显示)

[;,] ?|[ ]

模式匹配

  • [;,] ? 匹配 ;, 后跟可选的 space
  • |
  • [ ]匹配单个space

Regex demo | Python demo

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

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

模式匹配:

  • (?<=\d) 正后视,向左断言一个数字
  • (?: 交替的非捕获组
    • [;,] ? 匹配 ;, 后跟可选的 space
    • |
    • 匹配一个space
  • )关闭非捕获组
  • (?=\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']

我想你可以这样解释最后 space(s) 个:

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

此处\s*将捕获分隔符后的spaces,如果有的话。

也可以这样:

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

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

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

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

例如:

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