# Check if a string is ensembl gene id or not in python

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

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.

• 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. – terdon Sep 2 '18 at 11:13
• 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’ ? – Nikita Vlasenko Sep 2 '18 at 20:34
• 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. – terdon Sep 3 '18 at 8:22
• Of course, this is still not entirely correct since it will allow something like ENSABCDEFGHIJKL12345678901 which is clearly not a valid ID. – terdon Sep 3 '18 at 9:30

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])?)