Python字符串由多个定界符分隔

时间:2019-06-16 09:25:16

标签: python regex split

给出一个字符串:s = FFFFRRFFFFFFFPPRRRRRRLLRLLRLLLPPFPPLPPLPPLFPPFFPFLRPFFRRLLRPFPRFFFFFFFLFDRRFRRFFFFFFFFRQEE

分隔字符为PQDE

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

基于: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)。

此外,分隔字符的出现顺序也不固定。

正在寻找解决方案/提示以实现这一目标吗?

更新:所需的输出,这些定界符之间的所有字符串集(与所示的相似),但遵循上述最后一次出现的条件

Update2:预期输出

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

4 个答案:

答案 0 :(得分:2)

想要从首个字符出现到最后一个字符的顺序进行声音分割。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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', '']

答案 3 :(得分:0)

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

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']