【问题标题】:Python string split by multiple delimitersPython字符串被多个分隔符分割
【发布时间】:2019-06-16 09:25:16
【问题描述】:

给定一个字符串:s = FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE

分隔符为P、Q、D和E

我希望能够在这些字符上拆分字符串。

基于:Is it possible to split a string on multiple delimiters in order?

我有以下

def splits(s,seps):
    l,_,r = s.partition(seps[0])
    if len(seps) == 1:
        return [l,r]
    return [l] + splits(r,seps[1:])

seps = ['P', 'D', 'Q', 'E']

sequences = splits(s, seps)

这给了我:

['FFFFRRFFFFFFF',
 'PRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLF',
 'RRFRRFFFFFFFFR',
 '',
 'E']

我们可以看到第二个条目有很多P。

我想要的是最后一组P之间出现的字符,而不是第一次出现的字符(即RFFFFFFFLF)。

另外,分隔符的出现顺序也不是固定的。

正在寻找有关如何实现此目标的解决方案/提示?

更新:所需的输出,这些分隔符之间的所有字符串集(类似于显示的那个),但遵守上面最后一次出现的条件

更新 2:预期输出

['FFFFRRFFFFFFF',
 'RFFFFFFFLF',   # << this is where the output differs
 'RRFRRFFFFFFFFR',
 '',
 '']   # << the last E is 2 consecutive E with no other letters, hence should be empty

【问题讨论】:

  • 你的预期输出是什么?
  • 您想要的输出不清楚,但是如果您想在最后一次出现时拆分,请尝试将partition替换为rpartition。
  • 对不起,输出应该是分隔符之间存在的所有字符串集;类似于给定的,但坚持最后一次出现的条件。 (更新了问题)
  • 除了描述输出应该是什么样子之外,你能从字面上显示预期的输出吗?
  • 你需要的是like this吗?

标签: python regex split


【解决方案1】:

听起来你想从第一个字符出现到最后一个字符按顺序拆分。

([PDQE])(?:.*\1)?

有一个try with split pattern at regex101 和一个PHP Demo at 3v4l.org(在Python 中应该类似)。

【讨论】:

    【解决方案2】:
    import re
    
    s = "FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE"
    
    def get_sequences(s):
        seen_delimiters = {c: ('', None) for c in 'PDQE'}
        order = 0
        for g in re.finditer(r'(.*?)([PDQE]|\Z)', s):
            if g[2]:
                if seen_delimiters[g[2][0]][1] == None:
                    seen_delimiters[g[2][0]] = (g[1], order)
                    order += 1
        return seen_delimiters
    
    for k, (seq, order) in get_sequences(s).items():
        print('{}: order: {} seq: {}'.format(k, order, seq))
    

    打印:

    P: order: 0 seq: FFFFRRFFFFFFF
    D: order: 1 seq: RFFFFFFFLF
    Q: order: 2 seq: RRFRRFFFFFFFFR
    E: order: 3 seq: 
    

    更新(用于打印序列和分隔符):

    import re
    s = "FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE"
    for g in re.finditer(r'(.*?)([PDQE]+|\Z)', s):
        print(g[1], g[2])
    

    打印:

    FFFFRRFFFFFFF PP
    RRRRRRLLRLLRLLL PP
    F PP
    L PP
    L PP
    LF PP
    FF P
    FLR P
    FFRRLLR P
    F P
    RFFFFFFFLF D
    RRFRRFFFFFFFFR QEE
    

    【讨论】:

    • 这似乎在做我想做的事。让我用其他输入来测试它。我认为您之前发表的一篇简短文章捕获了字符序列和包围它的分隔符。如果可能的话,您能否将其也添加到您的答案中?谢谢!
    【解决方案3】:

    将re.split 与字符类[PQDE] 一起使用:

    import re
    
    s = 'FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE'    
    sequences = re.split(r'[PQDE]', s)
    print(sequences)
    

    输出:

    ['FFFFRRFFFFFFF', '', 'RRRRRRLLRLLRLLL', '', 'F', '', 'L', '', 'L', '', 'LF', '', 'FF', 'FLR', 'FFRRLLR', 'F', 'RFFFFFFFLF', 'RRFRRFFFFFFFFR', '', '', '']
    

    如果您想在 1 个或多个分隔符上进行拆分:

    import re
    
    s = 'FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE'    
    sequences = re.split(r'[PQDE]+', s)
    print(sequences)
    

    输出:

    ['FFFFRRFFFFFFF', 'RRRRRRLLRLLRLLL', 'F', 'L', 'L', 'LF', 'FF', 'FLR', 'FFRRLLR', 'F', 'RFFFFFFFLF', 'RRFRRFFFFFFFFR', '']
    

    如果要捕获分隔符:

    import re
    
    s = 'FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE'    
    sequences = re.split(r'([PQDE])', s)
    print(sequences)
    

    输出:

    ['FFFFRRFFFFFFF', 'P', '', 'P', 'RRRRRRLLRLLRLLL', 'P', '', 'P', 'F', 'P', '', 'P', 'L', 'P', '', 'P', 'L', 'P', '', 'P', 'LF', 'P', '', 'P', 'FF', 'P', 'FLR', 'P', 'FFRRLLR', 'P', 'F', 'P', 'RFFFFFFFLF', 'D', 'RRFRRFFFFFFFFR', 'Q', '', 'E', '', 'E', '']
    

    【讨论】:

    • 有没有办法识别上面输出的出现顺序?
    • @okkhoy:抱歉,“发生的顺序”是什么意思?
    【解决方案4】:

    此解决方案是逐个迭代分隔符,因此您可以控制要应用每个分隔符的顺序:

    s = 'FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE'
    spliters='PDQE'
    for sp in spliters:
        if type(s) is str:
            s = s.split(sp)
        else: #type is list
            s=[x.split(sp) for x in s]
            s = [item for sublist in s for item in sublist if item != ''] #flatten the list
    

    输出:

    ['FFFFRRFFFFFFF',
     'RRRRRRLLRLLRLLL',
     'F',
     'L',
     'L',
     'LF',
     'FF',
     'FLR',
     'FFRRLLR',
     'F',
     'RFFFFFFFLF',
     'RRFRRFFFFFFFFR']
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2020-04-23
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2017-03-25
      • 2021-02-25
      • 2012-05-12
      • 2021-09-25
      相关资源
      最近更新 更多