2012-08-16 22 views
2

我有一組像文件名:正則表達式用於捕獲組,其僅有時呈現

PATJVI_RNA_Tumor_8_3_63BJTAAXX.310_BUSTARD-2012-02-19.fq.gz 
PATMIF_RNA_Tumor_CGTGAT_2_1_BC0NKBACXX.334_BUSTARD-2012-05-07.fq.gz 

我想有一個單一的正則表達式(在python,僅供參考),可捕捉各之間的基團的「_」字符。但是請注意,在第二個文件名中,存在一個不存在於第一個文件名中的組。當然,可以使用字符串拆分等,但我想用一個正則表達式來完成此操作。第一個文件名正則表達式是這樣的:

(\w+)_(\w+)_(\w+)_(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz 

而第二個是:

(\w+)_(\w+)_(\w+)_(\w+)_(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz 

我想正則表達式組爲空時可選基團存在,幷包含可選當它存在時(這樣我可以稍後使用它來創建一個帶有\ 4的新文件名)。

回答

7

要使羣組可選,您可以在所需的羣組後添加?。像這樣: (\ w +)?

但是你的例子有一個下劃線,它也應該是可選的。要處理它,你可以將它與可選組合在一起。

((\w+)_)? 

但是,這會爲您的匹配結果添加一個新組。爲了避免它,使用不匹配的組:

(?:(\w+)_)? 

最終的結果將是這樣的:

(\w+)_(\w+)_(\w+)_(?:(\w+)_)?(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz 
+0

難道你需要翻轉'(?:'到處'(?: ' – alan 2012-08-16 14:01:19

+0

哎呀。感謝阿蘭。修復了帖子。 – Yossi 2012-08-16 14:03:14

+0

+1。將一個捕獲組放在一個非捕獲組內是一個很好的竅門。 – alan 2012-08-16 14:10:24