eniesee
eniesee

Reputation: 29

Need help writing a regex

I need a regex that reads a file with blast information. The file looks like:

****ALIGNMENT****
Sequence:  gi|516137619|ref|WP_017568199.1| hypothetical protein [Nocardiopsis synnemataformans]
length:  136
E_value:  8.9548e-11
score:  153.0
bit_score:  63.5438
identities:  35
positives:  42
gaps:  6
align_length:  70
query:  MIRIHPASRDPQTLLDPENWRSAAWNGAPIRDCRGCIDCCDDDWNRSEPEWRRCYGEHLAEDVRHGVAVC...
match:  MIRI  A+RD   LLDP NW S  W+ A  R CRGC DC       +     +CYGE + +DVRHGV+VC...
sbjct:  MIRIDRANRDHAELLDPANWLSFHWSNAT-RACRGCDDC-----GGTTETLVQCYGEGVVDDVRHGVSVC...

I already have a code, but in this file there is some extra data. The variable names with the corresponding name in this example, are:

hitsid = 516137619
protein = hypothetical protein
organism = Nocardiopsis synnemataformans
length = 136
evalue = 8.9548e-11
score = 153.0
bitscore = 63.5438
identities = 35
positives = 42
gaps = 6
query = MIRIHPASRDPQTLLDPENWRSAAWNGAPIRDCRGCIDCCDDDWNRSEPEWRRCYGEHLAEDVRHGVAVC...
match = MIRI  A+RD   LLDP NW S  W+ A  R CRGC DC       +     +CYGE + +DVRHGV+VC...
subject = MIRIDRANRDHAELLDPANWLSFHWSNAT-RACRGCDDC-----GGTTETLVQCYGEGVVDDVRHGVSVC...

I'm looking for something like this, this is a regex I already got, but now there are some extra things added:

p = re.compile(r'^Sequence:[^|]*\|(?P<hitsid>[^|]*)\|\S*\s*(?P<protein>[^][]*?)\s*\[(?P<organism>[^][]*)][\s\S]*?\nE-value:\s*(?P<evalue>.*)', re.MULTILINE)

File looks like:

****ALIGNMENT****
Sequence:  gi|516137619|ref|WP_017568199.1| hypothetical protein [Nocardiopsis synnemataformans]
length:  136
E_value:  8.9548e-11
score:  153.0
bit_score:  63.5438
identities:  35
positives:  42
gaps:  6
align_length:  70
query:  MIRIHPASRDPQTLLDPENWRSAAWNGAPIRDCRGCIDCCDDDWNRSEPEWRRCYGEHLAEDVRHGVAVC...
match:  MIRI  A+RD   LLDP NW S  W+ A  R CRGC DC       +     +CYGE + +DVRHGV+VC...
sbjct:  MIRIDRANRDHAELLDPANWLSFHWSNAT-RACRGCDDC-----GGTTETLVQCYGEGVVDDVRHGVSVC...

****ALIGNMENT****
Sequence:  gi|962700925|ref|BC_420072443.1| Protein crossbronx-like [Nocardiopsis synnemataformans]
length:  136
E_value:  8.9548e-11
score:  153.0
bit_score:  63.5438
identities:  35
positives:  42
gaps:  6
align_length:  70
query:  MIRIHPASRDPQTLLDPENWRSAAWNGAPIRDCRGCIDCCDDDWNRSEPEWRRCYGEHLAEDVRHGVAVC...
match:  MIRI  A+RD   LLDP NW S  W+ A  R CRGC DC       +     +CYGE + +DVRHGV+VC...
sbjct:  MIRIDRANRDHAELLDPANWLSFHWSNAT-RACRGCDDC-----GGTTETLVQCYGEGVVDDVRHGVSVC...

****ALIGNMENT****
Sequence:  gi|516137619|ref|WP_017568199.1| hypothetical protein [Nocardiopsis synnemataformans]
length:  136
E_value:  8.9548e-11
score:  153.0
bit_score:  63.5438
identities:  35
positives:  42
gaps:  6
align_length:  70
query:  MIRIHPASRDPQTLLDPENWRSAAWNGAPIRDCRGCIDCCDDDWNRSEPEWRRCYGEHLAEDVRHGVAVC...
match:  MIRI  A+RD   LLDP NW S  W+ A  R CRGC DC       +     +CYGE + +DVRHGV+VC...
sbjct:  MIRIDRANRDHAELLDPANWLSFHWSNAT-RACRGCDDC-----GGTTETLVQCYGEGVVDDVRHGVSVC...

Upvotes: 0

Views: 58

Answers (1)

Nikolay
Nikolay

Reputation: 11

You no need regexp:

parsed = []
raw_parts = open('tmp9.txt','r').read().split('****ALIGNMENT****')
for raw_part in raw_parts:
 parsed_dict = {}
 for line in raw_part.split('\n'):
  try:
   key,value = line.split(':')
   parsed_dict[key] = value.strip()
  except:
   pass
 parsed.append(parsed_dict)
print(parsed)

Upvotes: 1

Related Questions