Regex 由分离器拆分内部件由另一个分离器拆分

Regex 由分离器拆分内部件由另一个分离器拆分,regex,split,Regex,Split,这是一个示例.gtf文件的摘录。我需要用\t分隔符分割每一行,然后只分割获得的最后一个元素 X Ensembl Repeat 2419108 2419128 42 . . hid=trf; hstart=1; hend=21 X Ensembl Repeat 2419108 2419410 2502 - . hid=AluSx; hstart=1; hend=303 X Ensembl Repeat 2419108 2419128 0 . .

这是一个示例
.gtf
文件的摘录。我需要用
\t
分隔符分割每一行,然后只分割
获得的最后一个元素

X   Ensembl Repeat  2419108 2419128 42  .   .   hid=trf; hstart=1; hend=21
X   Ensembl Repeat  2419108 2419410 2502    -   .   hid=AluSx; hstart=1; hend=303
X   Ensembl Repeat  2419108 2419128 0   .   .   hid=dust; hstart=2419108; hend=2419128
X   Ensembl Pred.trans. 2416676 2418760 450.19  -   2   genscan=GENSCAN00000019335
X   Ensembl Variation   2413425 2413425 .   +   .   
X   Ensembl Variation   2413805 2413805 .   +   .
使用这个正则表达式(?:21$)|(?:\t*(.*?[^\t]+)
),我几乎可以按
\t
(我在行尾有问题)进行拆分。 我还尝试使用if-else和负lookaround分割最后一个元素,但没有结果

我怎么做

相关问题:

。第二个正则表达式清除该元素中的空白

匹配以下任一项:

  • 选择1
    • \t
      与制表符匹配
  • 选择2
    • 逐字匹配
    • [^\S\t]*
      匹配除
      \t
      之外的任意数量的空白字符。这就是清理第二个正则表达式中空白的方法
    • (?=[^\t]*$)
      积极的前瞻性,确保后续内容与以下内容匹配
      • [^\t]*
        可以多次匹配除
        \t
        以外的任何字符
      • $
        在行尾断言位置
我意识到这可能是一个文件,所以您可以打开该文件,然后在每一行上运行它,但我只是取了您在问题中输入的示例,并使用
splitlines()
拆分字符串以模拟这种行为

结果:

[
    ['X', 'Ensembl', 'Repeat', '2419108', '2419128', '42', '.', '.', 'hid=trf', 'hstart=1', 'hend=21'],
    ['X', 'Ensembl', 'Repeat', '2419108', '2419410', '2502', '-', '.', 'hid=AluSx', 'hstart=1', 'hend=303'],
    ['X', 'Ensembl', 'Repeat', '2419108', '2419128', '0', '.', '.', 'hid=dust', 'hstart=2419108', 'hend=2419128'],
    ['X', 'Ensembl', 'Pred.trans.', '2416676', '2418760', '450.19', '-', '2', 'genscan=GENSCAN00000019335'],
    ['X', 'Ensembl', 'Variation', '2413425', '2413425', '.', '+', '.', ''],
    ['X', 'Ensembl', 'Variation', '2413805', '2413805', '.', '+', '.']
]
。第二个正则表达式清除该元素中的空白

匹配以下任一项:

  • 选择1
    • \t
      与制表符匹配
  • 选择2
    • 逐字匹配
    • [^\S\t]*
      匹配除
      \t
      之外的任意数量的空白字符。这就是清理第二个正则表达式中空白的方法
    • (?=[^\t]*$)
      积极的前瞻性,确保后续内容与以下内容匹配
      • [^\t]*
        可以多次匹配除
        \t
        以外的任何字符
      • $
        在行尾断言位置
我意识到这可能是一个文件,所以您可以打开该文件,然后在每一行上运行它,但我只是取了您在问题中输入的示例,并使用
splitlines()
拆分字符串以模拟这种行为

结果:

[
    ['X', 'Ensembl', 'Repeat', '2419108', '2419128', '42', '.', '.', 'hid=trf', 'hstart=1', 'hend=21'],
    ['X', 'Ensembl', 'Repeat', '2419108', '2419410', '2502', '-', '.', 'hid=AluSx', 'hstart=1', 'hend=303'],
    ['X', 'Ensembl', 'Repeat', '2419108', '2419128', '0', '.', '.', 'hid=dust', 'hstart=2419108', 'hend=2419128'],
    ['X', 'Ensembl', 'Pred.trans.', '2416676', '2418760', '450.19', '-', '2', 'genscan=GENSCAN00000019335'],
    ['X', 'Ensembl', 'Variation', '2413425', '2413425', '.', '+', '.', ''],
    ['X', 'Ensembl', 'Variation', '2413805', '2413805', '.', '+', '.']
]

OP评论说正在使用Python,但其他语言可以。所以…我不确定这其中有多少(如果有的话)适用于Python,但我或多或少同意这样的评论,即试图用一个正则表达式来实现这一点是愚蠢的。例如,这里有一个perl,它或多或少地使用两个拆分:

perl -F"\t" -lane 'for $i (0..$#F){if ($i!=$#F) {print "$F[$i]"} else {print for split(/;\s?/, $F[$i])}}' input
为了解决这个问题,
-F“\t”
在选项卡上拆分为一个
F
数组。然后我循环遍历它,并用分号分割最后一个元素。而且…作为一个班轮,这是可以的,但几乎没有。试图利用这一成果做更多的工作将变得荒谬可笑

但是后来我看到@ctwheels的答案(这里是Perl的等价物):


这太棒了。输入已经分开了,在我开始之前所有的事情都完成了。“程序”(
print for@F
)只是打印结果……这意味着如果我有其他工作要做,我可以很容易地完成。说实话,我只需盯着它看几分钟,它就不再伤害我的大脑了。可能比“代码”答案更容易理解,并且基本上可以在任何PCRE类型的语言之间移植。

OP评论说正在使用Python,但其他语言可以。所以…我不确定这其中有多少(如果有的话)适用于Python,但我或多或少同意这样的评论,即试图用一个正则表达式来实现这一点是愚蠢的。例如,这里有一个perl,它或多或少地使用两个拆分:

perl -F"\t" -lane 'for $i (0..$#F){if ($i!=$#F) {print "$F[$i]"} else {print for split(/;\s?/, $F[$i])}}' input
为了解决这个问题,
-F“\t”
在选项卡上拆分为一个
F
数组。然后我循环遍历它,并用分号分割最后一个元素。而且…作为一个班轮,这是可以的,但几乎没有。试图利用这一成果做更多的工作将变得荒谬可笑

但是后来我看到@ctwheels的答案(这里是Perl的等价物):


这太棒了。输入已经分开了,在我开始之前所有的事情都完成了。“程序”(
print for@F
)只是打印结果……这意味着如果我有其他工作要做,我可以很容易地完成。说实话,我只需盯着它看几分钟,它就不再伤害我的大脑了。可能比“代码”答案更容易理解,并且基本上可以在任何PCRE类型的语言之间移植。

哪种语言?预期输出是什么?我询问的原因是某些行没有
我也不明白你所说的“我在行尾有问题”是什么意思。您的意思是输入格式不正确吗?如果您正在努力将一个正则表达式写入规则erm。。。将它们全部匹配,而不是编写一个正则表达式来获得最后一部分,然后编写另一个(甚至是几乎每种语言都有的内置函数-split)来分割最后一个元素?为什么要让你的生活变得艰难?@zzxyz在我给出的例子中,这场比赛一直延续到新词之后,所以我的正则表达式是错误的。输入是哪种语言?预期输出是什么?我询问的原因是某些行没有
我也不明白你所说的“我在行尾有问题”是什么意思。您的意思是输入格式不正确吗?如果您正在努力将一个正则表达式写入规则erm。。。将它们全部匹配,而不是编写一个正则表达式来获得最后一部分,然后编写另一个(甚至是几乎每种语言都有的内置函数-split)来分割最后一个元素?为什么要让你的生活变得艰难?@zzxyz在我给出的例子中,这场比赛一直延续到新词之后,所以我的正则表达式是错误的。输入是赞成的,因为这太棒了。但是…
'hid=trf;hstart=1'
不正确,否?(我将其解读为拆分通过制表符拆分获得的最后一个元素的全部内容)。@zzxyz谢谢,已修复。我读的不一样。吉文
perl -F'/\t|;[^\S\t]*(?=[^\t]*$)/' -lane 'print for @F' input