2013-05-30 25 views
0

我是一個Python新手,並且使用正則表達式()有一個問題。我有一個父目錄和一個子目錄。正則表達式python:error:無與倫比的組

I'm using the regex(r'(.*/)?(.+/)(.+)\.bam') 

使文件與子目錄中存在的前綴'.bam'匹配。一個函數使用regex(),執行一些任務並給出輸出,我需要將輸出寫入父目錄。

這是我試圖做的全部功能。

func(task,regex(r'(.*/)?(.+/)(.+)\.bam'),r'\1\3.output') 

「.OUTPUT」將被添加到輸出的後綴,它示出了錯誤‘錯誤:無法比擬的基團’。有誰能幫助解決這個問題嗎?或提供一個優雅的方式來做到這一點?

+0

這是什麼'regex'函數?你的正則表達式編譯得很好。 – Blender

+0

實際上函數是從一個包Ruffus.Here是原始函數:@transform(任務,正則表達式(r'(。* /)?(。+ /(。+)\。bam'),r'\ 1 \ 3.output')。這個函數接受來自regex()格式任務的輸入文件和輸出後綴'.output'。如果我從父目錄運行函數,它應該把輸入(r'(。* /)?(。+ /)(。+)\。bam'),r'\ 1 \ 3.output')會執行什麼操作有需要嗎?或我即將出錯? – chas

+0

您能提供一些您正在搜索的示例文本和期望的輸出嗎? –

回答

1

描述

該表達式將拉取文件名,文件路徑和當前文件夾的父路徑。

((.*[\/])[^\/]*[\/])([^\/]*?)[.]bam

enter image description here

  • (開始捕獲組1個
  • (開始捕獲組2
  • .*[\/]貪婪匹配整個字符串高達...
  • )接近捕獲組2
  • [^\/]*[\/]需要將當前目錄
  • )接近捕獲組1
  • (開始捕獲組3
  • [^\/]*?非貪婪匹配所有非/字符之前...
  • )接近捕獲組3
  • [.]要求點字符
  • bam要求bam值

集團0獲取整個字符串

  1. 獲取當前路徑
  2. 得到該文件夾​​的父
  3. 獲取文件名與.bam擴展

示例

我不太瞭解python,所以這裏有一個PHP示例來展示這個正則表達式的工作原理。

$sourcestring="/ParentFolder1/SubFolder1/FileFoobar1.bam 
/Some/Really/Deep/Folder/ParentFolder2/SubFolder2/FileFoobar2.bam"; 
preg_match_all('/((.*[\/])[^\/]*[\/])([^\/]*?)[.]bam/im',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 

$matches Array: 
(
    [0] => Array 
     (
      [0] => /ParentFolder1/SubFolder1/FileFoobar1.bam 
      [1] => /Some/Really/Deep/Folder/ParentFolder2/SubFolder2/FileFoobar2.bam 
     ) 

    [1] => Array 
     (
      [0] => /ParentFolder1/SubFolder1/ 
      [1] => /Some/Really/Deep/Folder/ParentFolder2/SubFolder2/ 
     ) 

    [2] => Array 
     (
      [0] => /ParentFolder1/ 
      [1] => /Some/Really/Deep/Folder/ParentFolder2/ 
     ) 

    [3] => Array 
     (
      [0] => FileFoobar1 
      [1] => FileFoobar2 
     ) 

)