【问题标题】:Splitting String with Multiple Delimiters in a Particular Order以特定顺序拆分具有多个分隔符的字符串
【发布时间】:2018-04-21 18:43:48
【问题描述】:

我正在处理一种 ASCII 文件,其中实际上有 4 列数据,每一行都分配给文件中的一行。下面是该文件中一行数据的示例

'STOP.F 11966.0000:STOP DEPTH'

数据始终是结构化的,第一列和第二列之间的分隔符是句点,第二列和第三列之间的分隔符是空格,第三列和第四列之间的分隔符是冒号。

理想情况下,我想找到一种方法从上面的字符串中返回以下结果

['STOP', 'F', '11966.0000', 'STOP DEPTH']

我尝试使用带有句点、空格和冒号作为分隔符的正则表达式,但它会崩溃(参见下面的示例),因为我不知道如何指定拆分字符串的具体顺序,而且我不知道'不知道是否有一种方法可以在正则表达式本身中指定每个分隔符的最大拆分数。我希望它按特定顺序拆分分隔符,每个分隔符最多 1 次。

import re
line = 'STOP.F 11966.0000:STOP DEPTH'
re.split("[. :]", line)
>>> ['STOP', 'F', '11966', '0000', 'STOP', 'DEPTH']

有什么建议可以做到这一点吗?

【问题讨论】:

  • 这个表达式将线分成4个捕获组。 ^(.+)\.(.+) (.+):(.+)$ 我不知道你是如何在python中实现的
  • 应用@Juan 提供的正则表达式,这似乎可以解决问题:re.split("(.+)\.(.+) (.+):(.+)", line)[1:5]

标签: python string split


【解决方案1】:

re.split() 具有特定正则表达式模式的解决方案:

import re

s = 'STOP.F 11966.0000:STOP DEPTH'
result = re.split(r'(?<=^[^.]+)\.|(?<=^[^ ]+) |:', s)

print(result)

输出:

['STOP', 'F', '11966.0000', 'STOP DEPTH']

【讨论】:

  • 这个确切的代码在 python 3.6.2 中引发了以下错误:sre_constants.error: look-behind requires fixed-width pattern 我试图先比较编译模式的执行时间。
【解决方案2】:

这可能有效。感谢Juan

import re
pattern = re.compile(r'^(.+)\.(.+) (.+):(.+)$')
line = 'STOP.F 11966.0000:STOP DEPTH'
pattern.search(line).groups()
Out[6]: ('STOP', 'F', '11966.0000', 'STOP DEPTH')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多