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

sea*_*avi 2 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
Run Code Online (Sandbox Code Playgroud)

我想有一个正则表达式(在python中,fyi)可以捕获"_"字符之间的每个组.但请注意,在第二个文件名中,存在一个不存在于第一个文件名中的组.当然,可以使用字符串拆分等,但我想用一个正则表达式来做这个.第一个文件名的正则表达式如下:

(\w+)_(\w+)_(\w+)_(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz
Run Code Online (Sandbox Code Playgroud)

第二个是:

(\w+)_(\w+)_(\w+)_(\w+)_(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz
Run Code Online (Sandbox Code Playgroud)

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

Yos*_*ssi 7

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

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

((\w+)_)?
Run Code Online (Sandbox Code Playgroud)

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

(?:(\w+)_)?
Run Code Online (Sandbox Code Playgroud)

最终结果如下:

(\w+)_(\w+)_(\w+)_(?:(\w+)_)?(\d)_(\d)_(\w+)\.(\d+)_(\S+)\.fq\.gz
Run Code Online (Sandbox Code Playgroud)