1
$\begingroup$

I have many scRNAseq datasets saved as hdf5 files (hierarchical data format*), and when I open them keys sometimes are confused, so I need a way of determining from string values themselves whether the array contains gene symbols or ensembl ids. What would be a regular expression in python to check for it?

*, A database format for quickly accessing large amounts of data, which is accessed using keys. The format is quicker than pickle/unpickle and can be viewed via a hdf5 viewer, a bit of info is here

$\endgroup$

2 Answers 2

2
$\begingroup$

Fixed it myself actually, not that hard. I found regular expression for ensembl ids here:

https://www.biostars.org/p/99142/

And used the re package in python:

import re

ensembl_regexp = 'ENS[A-Z]+[0-9]{11}'

is_ensembl = np.all([bool(re.match(ensembl_regexp, gene)) for gene in gene_symbols])
    if is_ensembl:
        gene_symbols = list(f['ensembl_ids']) 

Where gene_symbols is a numpy array that I need to check whether it has ensembl ids, and if yes, switch to using gene symbols which are going to be under ensembl_ids key due to a mistake of someone who made the hdf5 dataset.

$\endgroup$
4
  • $\begingroup$ What kind of Ensembl IDs are matched by the second part of that regex? ENS[A-Z]+[0-9]{11} matches the standard Ensembl IDs, what does the rest do? It looks like it matches FlyBase IDs (CG[0-9]+), and all sorts of other things. For example, that regex would consider CG1 or ABC123bobbie valid Ensembl IDs. $\endgroup$
    – terdon
    Commented Sep 2, 2018 at 11:13
  • $\begingroup$ Not sure, that’s what I got from the ‘Biostars’ link that is present in the answer. Maybe ask the person who answered it on ‘Biostars’ ? $\endgroup$ Commented Sep 2, 2018 at 20:34
  • 1
    $\begingroup$ Is this your question originally? Did you test this solution? The regex matches all sorts of IDs, many of which are not Ensembl. I have edited your answer so that it only matches Ensembl IDs as the question asks for. $\endgroup$
    – terdon
    Commented Sep 3, 2018 at 8:22
  • 1
    $\begingroup$ Of course, this is still not entirely correct since it will allow something like ENSABCDEFGHIJKL12345678901 which is clearly not a valid ID. $\endgroup$
    – terdon
    Commented Sep 3, 2018 at 9:30
2
$\begingroup$

The answer by terdon is probably good enough, but some commenters have noted it will allow something like ENSABCDEFGHIJKL12345678901.

It's helpful to reference the official documentation of Ensembl Stable Ids:

Stable IDs are created in the form ENS[species prefix][feature type prefix][a unique eleven digit number]. For example a mouse gene might be ENSMUSG###########. This means that we can immediately tell from a stable ID what kind of feature they refer to and what species they are in. The prefixes are listed on our prefix page.

The two places I look first for regexes are identifiers.org and wikidata. If these are wrong, best to report that upstream. Here are their ensembl regexes:

The regex used by the identifiers.org registry (for any ensembl ID) is quite long:

^((ENS[FPTG]\\d{11}(\\.\\d+)?)|(FB\\w{2}\\d{7})|(Y[A-Z]{2}\\d{3}[a-zA-Z](\\-[A-Z])?)|([A-Z_a-z0-9]+(\\.)?(t)?(\\d+)?([a-z])?))$

Meanwhile Wikidata has this regex for an Ensembl gene ID:

(ENS(|MUS|RNO)G\d{11})|(Y[A-P][LR]\d{3}[CW](-[A-G])?)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.