用于捕获有时仅存在的组的正则表达式

时间:2012-08-16 13:52:32

标签: python regex grouping

我有一组文件名,如:

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中,fyi)可以捕获“_”字符之间的每个组。但请注意,在第二个文件名中,存在一个不存在于第一个文件名中的组。当然,可以使用字符串拆分等,但我想用一个正则表达式来做这个。第一个文件名的正则表达式如下:

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

第二个将是:

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

当可选组存在时,我希望正则表达式组为空,并且当它存在时包含可选组(以便稍后我可以使用它来构造带有\ 4的新文件名)。

1 个答案:

答案 0 :(得分:7)

要使组可选,您可以在所需的组之后添加?。像这样:     (\ W +)?

但是你的例子有一个下划线,也应该是可选的。要处理它,您可以将它与可选组一起分组。

((\w+)_)?

但是,这会为您的匹配结果添加一个新组。要避免它,请使用不匹配的组:

(?:(\w+)_)?

最终结果如下:

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