使用Python正则表达式在一个模式中剪切

Mic*_*ter 12 python regex string split protein-database

目标:我正在尝试在Python RegEx中执行切换,其中split不能完全按照我的意愿执行.我需要在一个模式中剪切,但在角色之间.

我在找什么:

我需要在字符串中识别下面的模式,并将字符串拆分到管道的位置.管道实际上不在字符串中,它只显示我要分割的位置.

图案: CDE|FG

串: ABCDEFGHIJKLMNOCDEFGZYPE

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

我尝试过的:

我似乎使用带括号的split是接近的,但是它并没有像我需要的那样将搜索模式保持在结果上.

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

给人,

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

当我真的需要的时候,

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

动机:

使用RegEx进行练习,并想看看我是否可以使用RegEx制作一个脚本来预测使用特定蛋白酶消化蛋白质的片段.

Bha*_*Rao 7

非正则表达方式是用管道值替换模式然后拆分.

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

  • @Yab完全正确.答案是正则表达式的*更快*替代方案.OP提到他们对评论中的非正则表达式答案持开放态度,因此答案也是如此.假设*pipe*在数据集中不存在.通常在这种情况下,使用包含特殊字符和unicode文字的多个分隔符.我没有用它来演示一个简单的用例. (2认同)

ale*_*cxe 5

你可以用re.split()积极的"环顾四周"来解决它:

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

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

import re

s = "ABCDEFGHIJKLMNOCDEFGZYPE"

cut_sequences = [
    ["CDE", "FG"],
    ["FGHI", ""],
    ["", "FGHI"]
]

for left, right in cut_sequences:
    items = re.split(r"(?<={left})(\w+)(?={right})".format(left=left, right=right), s)

    if not left:
        items = items[1:]

    if not right:
        items = items[:-1]

    print(items)
Run Code Online (Sandbox Code Playgroud)

打印:

['ABCDE', 'FGHIJKLMNOCDE', 'FGZYPE']
['ABCDEFGHI', 'JKLMNOCDEFGZYPE']
['ABCDE', 'FGHIJKLMNOCDEFGZYPE']
Run Code Online (Sandbox Code Playgroud)