Python分割字符串并在解析处添加字符

3
注意:我是一名化学家,几乎没有编程经验。
我想通过一个特定的分隔符拆分列表中的每个字符串,然后将每个解析出来的字符串添加到一个新列表中。为了方便起见,对于每次解析,我希望在一个字符串的末尾添加一个字符,并在下一个字符串的开头添加一个字符,以便跟踪分隔位置。例如:
TestString = 'AAABA'
parsed = TestString.split('B')
print(parsed)

将输出:

['AAA','A']

I would like the output to be:

['AAAx', 'xA']

我正在寻找一个能够处理仅包含我的分隔符的字符串的解决方案。我的最终目标将涉及解析大量字符串列表(每个列表中有1-1000个字符串,字符串长度变化不定)。另一个例子:

TestList = ['A', 'B', 'AB', 'BA', 'BBB','ABA', 'AAA']
Parsed = []
for i in range(len(TestList)):
     parsed = TestList[i].split('B')
     Parsed.extend(parsed)
print(Parsed)

将会输出:

['A', '', '', 'A', '', '', 'A', '', '', '', '', 'A', 'A', 'AAA']

我希望输出的结果如下:

我希望输出的结果如下:

['A','x', 'x', 'Ax', 'x', 'x', 'xA', 'x', 'xx', 'xx', 'x', 'Ax', 'xA', 'AAA']

将'B'分成['x'和'x']; 'BB'分成['x','xx','x'],等等。

有没有简单的方法可以实现这个功能?我尝试过使用正则表达式,但在应用(或编译)我的模式到数据集中的变量字符串长度时遇到了麻烦。我在stackoverflow上搜索并进行了一些在线搜索,但找不到非常有用的东西。我知道我可以在字符串的开头和结尾添加字符,但任何解决方案都不应该在未解析的字符串中添加字符。我考虑尝试添加一堆“if”条件语句,以尝试覆盖所有可能性,但这似乎会很麻烦,如果有更简单的解决方案,我更喜欢。

编辑:回应评论,我真的想把我的字符串“切成一半的“B”单位,并添加一个表示一半“B”单位的字符。

在下面的图像中,黑线表示一串“A”。箭头左边:仅带有明确绘制的“B”单位的单个字符串。箭头右侧:在“B”上解析后,将产生3个字符串。每个“B”单位被切成两半并替换为“x”。 Description

思考示例'BBB',第一次解析将导致['x','xBB']。第二步结果为['x','xx','xB']。最后一步结果为['x','xx','xx','x']

解析后,将不再存在“B”单位。这是一个与化学相关的问题,“xx”和“B”实际上是不同的实体(即使“x”是“B”单位的一半)。值得注意的是,将'AAABAAA'解析为['AAAx','xAAA']很重要,因为这两个字符串都不等同于一开始根本不包含'B'单位的字符串'AAA'


只是确认一下,如果你有 List = ["AB", "BB", "BA"],你想要的是:"ABx xBBx xBA" 吗? - Evorage
我不确定我真正理解这里的规范...为什么"BBB"会变成['x', 'xx', 'xx', 'x']?那么"BBBB""BBBBB"会变成什么呢?如果像"ABBA"或者像"ABABBBABBAA"这样复杂的元素(我假设有,因为有些字符串长度为1000),会怎么样呢?感谢您的澄清。 - ggorlen
3个回答

6

尝试这个:

  1. First replace 'B' with 'x-x'

  2. Split the string with separator '-'.

     string = 'AAABA'
     string = string.replace('B', 'x-x')
     print( string.split('-') )
    
     OUT: ['AAAx', 'xA']`
    
string = 'AABBA'
string = string.replace('B', 'x-x')
print( string.split('-') )

out: ['AAx', 'xx', 'xA']


+1 我简直不敢相信我没想到这个。我觉得今天我一直盯着电脑看太久了。 - user8273394
说实话,我很惊讶它能够工作。是的,有时候简单的解决方案是最好的。 - klv0000

0
这是一个自定义的 split 函数,我相信它可以实现你想要的功能。每当有一个分割时,都包含一个符号 'x' 来标记它发生了:
def my_split(s, delim, split_sym='x'):
    output = []
    substring = ''
    for c in s:
        if c == delim:
            output.append(substring + split_sym)
            substring = split_sym
        else:
            substring += c
    output.append(substring)
    return output

请注意,split_sym 的值为 '' 相当于普通的 split(不确定这个实现是否相同,但我相信输出应该匹配)。
针对您的测试案例进行测试:
tests = ['A', 'B', 'AB', 'BA', 'BBB','ABA', 'AAA']
parsed = []
for s in tests:
    parsed.extend(my_split(s, 'B'))
print(parsed)

输出:

['A', 'x', 'x', 'Ax', 'x', 'x', 'xA', 'x', 'xx', 'xx', 'x', 'Ax', 'xA', 'AAA']

-1

你可以在生成器中使用递归:

def get_xs(s):
  if (ind:=next((i for i, a in enumerate(s) if a == 'B'), None)) is not None:
     k = s[:ind]+'x'+s[ind+1:]
     yield k[:(x:=[j for j, l in enumerate(k) if l == 'x'][-1])+1]
     yield from get_xs(k[x:])
  elif s:
     yield s

testlist = ['A', 'B', 'AB', 'BA', 'BBB','ABA', 'AAA']
new_list = [i for b in testlist for i in get_xs(b)]
print(new_list)

输出:

['A', 'x', 'x', 'Ax', 'x', 'x', 'xA', 'x', 'xx', 'xx', 'x', 'Ax', 'xA', 'AAA']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接