使用Python regex在模式中剪切

2024-05-17 10:56:06 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:我试图在Python RegEx中执行一个剪切,其中split不能完全实现我想要的效果。我需要在一个模式内,但在字符之间。在

我要找的是:

我需要在一个字符串中识别下面的模式,并在管道位置拆分字符串。这根管子实际上并不在绳子里,它只是显示我想在哪里分裂。在

图案:CDE|FG

字符串:ABCDEFGHIJKLMNOCDEFGZYPE

结果:['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']

我的尝试:

我似乎使用带括号的split似乎很接近,但它并没有像我需要的那样将搜索模式附加到结果中。在

re.split('CDE()FG', 'ABCDEFGHIJKLMNOCDEFGZYPE')

给予

['AB', 'HIJKLMNO', 'ZYPE']

当我需要的时候

['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']

动机:

我想看看我是否可以用正则表达式来编写一个脚本,用特定的蛋白酶来预测蛋白质消化的片段。在


Tags: 字符串目标管道模式字符regexsplit管子
3条回答

你可以用re.split()和正的"look arounds"来解决它:

>>> re.split(r"(?<=CDE)(\w+)(?=FG)", s)
['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']

请注意,如果其中一个剪切序列是空字符串,则会在结果列表中得到一个空字符串。你可以“手动”处理,样本(我承认,它不是那么漂亮):

^{pr2}$

印刷品:

['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']
['ABCDEFGHI', 'JKLMNOCDEFGZYPE']
['ABCDE', 'FGHIJKLMNOCDEFGZYPE']

若要在使用re.split或其部分拆分时保持拆分模式,请将它们括在括号中。在

>>> data
'ABCDEFGHIJKLMNOCDEFGZYPE'
>>> pieces = re.split(r"(CDE)(FG)", data)
>>> pieces
['AB', 'CDE', 'FG', 'HIJKLMNO', 'CDE', 'FG', 'ZYPE']

很简单。所有的部件都在那里,但是正如你所看到的,它们已经分开了。所以我们需要重新组装。这才是最棘手的部分。仔细看,你会发现你需要把前两个部分连接起来,最后两个部分连接起来,剩下的三个部分连接起来。我通过填充列表来简化代码,但是如果性能有问题,可以使用原始列表(以及一些额外的代码)来完成。在

^{pr2}$

re.split()保证为每个捕获(带圆括号)组分配一个片段,再加上一个片段用于介于两者之间的组。对于需要自己分组的更复杂的正则表达式,请使用非捕获组来保持返回数据的格式不变。(否则需要调整重新组装步骤。)

我也喜欢Bhargav Rao的建议,在字符串中插入一个分隔符字符。如果性能不是问题,我想这是一个品味的问题。在

编辑:这里有一种(透明度较低)方法,可以在不向列表中添加空字符串的情况下进行编辑:

pieces = re.split(r"(CDE)(FG)", data)
result = [ "".join(pieces[max(i-3,0):i]) for i in range(2,len(pieces)+2, 3) ]

一种非regex方法是使用管道值replace对模式执行split。在

>>> pattern = 'CDE|FG'
>>> s = 'ABCDEFGHIJKLMNOCDEFGZYPE'
>>> s.replace('CDEFG',pattern).split('|')
['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']

相关问题 更多 >