<p>You might consider changing the code to make the whitespace a little more consistent (as it was, it failed when i tried to run it).</p>
<p>Also, why are you using regular expressions? You have already extracted the <code>gene_id</code> using Biopython. The following works for me:</p>
<p>(updated to handle the underscore delimiting)</p>
<pre><code>from Bio import SeqIO
import sys
import re 

fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, &quot;fasta&quot;):
    if len(myfile.seq) &gt; 250:  # note .seq here!
        gene_id = myfile.id
        # unclear why using regex
        #match_list = re.match('H149xcV\_\w+\_\w+\_\w+',gene_id)
        #print (&quot;&gt;&quot;+match_list.group(0)) 
        print(&quot;_&quot;.join(gene_id.split(&quot;_&quot;)[0:-1]))
</code></pre>

CC BY-SA 4.0
2020-11-23T20:43:13.083Z
Hi @MaximilianPress , how would I change the regex so that it only provides me with `>H149xcV_Fge342_r3_h2` and not`>H149xcV_Fge342_r3_h2_d1`. I would not like the very end part that consists of `d1`. So basically, how can I format it so it it only provides this `>H149xcV_Fge342_r3_h2`. If I am using regex would I not need to use gene.id?
andnowmywatchbegins
CC BY-SA 4.0
2020-11-23T21:13:17.480Z
@andnowmywatchbegins wants to remove the stuff after the space in the fasta header. In phylogeny this is either removed or spaces substituted because the space in phylip format denotes the start of the sequence
M__
CC BY-SA 4.0
2020-11-23T21:20:06.783Z
@Michael I've tried reformatting the entire regular expression and I am still getting the full `>H149xcV_Fge342_r3_h2_d1`, is there a way to only receive `>H149xcV_Fge342_r3_h2` as in output? Thanks!
andnowmywatchbegins
CC BY-SA 4.0
2020-11-23T21:23:37.600Z
Can you put this as a separate question please? .. Yes you will but thats a different part of regex
M__
CC BY-SA 4.0
2020-11-23T22:45:27.060Z
@Michael stuff after the whitespace is already stripped out by biopython when you use the `.id`. this is one of the more annoying behaviors of biopython IMO, but in this instance it is useful. I've confirmed that my example code does this. It admittedly does not handle the underscore delimitation, which I missed. But that can be done with split much more simply.
Maximilian Press
CC BY-SA 4.0
2020-11-23T22:48:33.910Z
@andnowmywatchbegins why not just split on `_` and only keep as many `_`-delimited fields as you want? Regex will work for this in theory but it's annoying to debug in cases like this.
Maximilian Press
CC BY-SA 4.0
2020-11-23T22:51:13.940Z
@MaximilianPress I've put a response here .. https://bioinformatics.stackexchange.com/questions/14913/how-to-obtain-desired-output
M__
CC BY-SA 4.0
2020-11-24T19:10:43.783Z
@MaximilianPress "if len(myfile.seq) > 250:  # note .seq here!" -- `.seq` is actually not needed there
Chris_Rands
CC BY-SA 4.0
2020-11-24T19:12:41.417Z
@Chris_Rands ah, good to know... another confusing feature of biopython!
Maximilian Press
CC BY-SA 4.0
2020-11-23T20:28:07.413Z
2020-11-23T22:50:26.163Z
2020-11-23T22:50:26.163Z
Maximilian Press
<p>You wrote,</p>
<pre><code>mylist = re.match(H149xcV\_\w+\_\w+\_\w+)
</code></pre>
<p>try...</p>
<pre><code>myregex = re.compile(r'H149xcV\_\w+\_\w+\_\w+')
mylist = myregex.match(myfile.id)
</code></pre>
<p>or</p>
<pre><code>mylist = re.match(r'H149xcV\_\w+\_\w+\_\w+',myfile.id)
</code></pre>
<p>Watch your indentation it should be 4 spaces. Note you are losing the last '_\w+', but don't think it matters.</p>
<p>I think it is better to use,</p>
<pre><code>mylist, _, _ = re.split(r' ', myfile.id)
</code></pre>
<p>The problem with your code is <code>list</code> will just return <code>true</code> ... and that is not what you want. If you are using <code>split</code> carefully watch the number of ' ' in your code you can also use <code>r'\s'</code></p>
<p>You can also set maxsplit as a parameter, which might be useful.</p>
<hr />
<p><code>myfile</code> not defined.</p>
<p>Please try,</p>
<pre><code>fasta_file = (sys.argv[0])
</code></pre>
<p>Generally your argv command isn't cool and not just [0] versus [1]. I forget the argv module everyone uses .. there's two of them, they are a bit fiddle but are very cool of options. You way in is okay, okayish, sort of okay ... Anyway you appear to be requesting the second input into the commandline, wherea you are probably placing the fasta file in the first position.</p>
<p>Also</p>
<pre><code>print (fasta_file)
</code></pre>
<p>Check something happens that you picked up the file.</p>
<p>The other way in is,</p>
<pre><code>mypath = '/User/username/location/fasta.fa'
for myfile in SeqIO.parse(mypath, &quot;fasta&quot;):
</code></pre>
<p>where <code>mypath</code> is a OS X style, you're probably using Linux so its... /home/username/pathtofile/fastafile.fa (something like that) or</p>
<pre><code>for myfile in SeqIO.parse('/User/username/location/fasta.fa', &quot;fasta&quot;):
</code></pre>
<p>I forgot .... don't ever use <code>list</code> as a variable, by <code>mylist</code> is fine. Again I've not debugged my code.</p>

CC BY-SA 4.0
2020-11-23T19:24:43.910Z
Hi @Michael I tried doing that, but received a NameError indicating that the name 'myfile' is not defined. I appreciate your help!
andnowmywatchbegins
CC BY-SA 4.0
2020-11-23T20:11:52.297Z
@andnowmywatchbegins can you update your answer with this information?
Maximilian Press
CC BY-SA 4.0
2020-11-23T20:16:51.913Z
`list` is used in Python for creating lists. I would recommend naming this variable something else.
Alex Reynolds
CC BY-SA 4.0
2020-11-23T20:34:52.373Z
`list` .... Yes!! Use `mylist` as a variable. instead
M__
CC BY-SA 4.0
2020-11-23T19:08:16.690Z
2020-11-23T20:46:42.260Z
2020-11-23T20:46:42.260Z
M__
<p>I am working on a project and am having issues with the following code that I have written in <code>nano</code>:</p>
<pre><code>from Bio import SeqIO
import sys
import re 


    fasta_file = (sys.argv[1])
    for myfile in SeqIO.parse(fasta_file, &quot;fasta&quot;):
      if len(myfile) &gt; 250:
       gene_id = myfile.id
       mylist = re.match('H149xcV\_\w+\_\w+\_\w+',gene_id)
       print (&quot;&gt;&quot;+list.group(1)) 
</code></pre>
<p>This is the error I receive when I execute my command on <code>command-line</code>:</p>
<pre><code>File &quot;mpo.py&quot;, line 7, in &lt;module&gt;
    gene_id = myfile.id
NameError: name 'myfile' is not defined
</code></pre>
<p>I have a fasta file with the format</p>
<pre class="lang-none prettyprint-override"><code>&gt;H149xcV_Fge342_r3_h2_d1 len=210 path=[0:0-206]
ACTATACATGAGGAGAACATAGAACAAAAATGGGACCATAGATATATAACAATAGAAGATATAGAGAACACAATAGACAACTTATTAGGAAAGAGGTGTGTCGTCATGGAGCTGATGTTCGAGGATACTTTGCATGGTCATTCTTGGATAATTTTGAGTGGGCTATGGGATACACCAAGAGGTTTGGCATTGTTTATGTTGATTATAAGAACGGGC

&gt;H149xcV_ytR1oP_r3_h2_d1 len=306 path=[0:0-207]
ATTAGAGTCTGAGAGAGTCTTGATTTGTCGTCGTCGAGAAATATAGGAGATCTGATTAGAGGAGAGAGCGGCCTAGGCGATGCGCGATATAGCGCTATATAGGCCTAGAGGAGAGTCTCTCTCTTTTAGAAGAGATAATATATATATATATATGGCTCTCCGGCGGGGCCGCGCGAGAGCTCGATCGATCGATATTAGCTGTACGATGCTAGCTAGCTTATATTCGATCGATTATAGCTTAGATCTCTCTCTAAAGGTCGATATCGCTTATGCGCGCGTATATCG
</code></pre>
<p>I wish to reformat my file so that it only provides me with the unique gene id's for genes with a length greater than 250 bp.</p>
<p>My desired output is:</p>
<pre><code>&gt;H149xcV_Fge342_r3_h2
&gt;H149xcV_ytR1oP_r3_h2
&gt;H149xcV_DPN78333_r3_h2
&gt;H149xcV_AgV472_r3_h2
&gt;H149xcV_DNP733_r3_h2
</code></pre>

CC BY-SA 4.0
2020-11-23T20:13:03.213Z
note that after your edit, your code now does not match your error. You should update the error to the new error, otherwise we can't help you very well.
Maximilian Press
CC BY-SA 4.0
2020-11-23T20:18:01.603Z
Hi @MaximilianPress I have updated the error!
andnowmywatchbegins
CC BY-SA 4.0
2020-11-23T20:49:40.757Z
I updated the post to attempt to trap the bugs.
M__
<python><phylogenetics><fasta><phylogeny><seqio>
How to fix NameError?
# How to fix NameError?

(Asked by: username_0 on 2020-11-23)

I am working on a project and am having issues with the following code that I have written in nano:
from Bio import SeqIO
import sys
import re 


    fasta_file = (sys.argv[1])
    for myfile in SeqIO.parse(fasta_file, "fasta"):
      if len(myfile) > 250:
       gene_id = myfile.id
       mylist = re.match('H149xcV\_\w+\_\w+\_\w+',gene_id)
       print (">"+list.group(1)) 

This is the error I receive when I execute my command on command-line:
File "mpo.py", line 7, in 
    gene_id = myfile.id
NameError: name 'myfile' is not defined

I have a fasta file with the format
>H149xcV_Fge342_r3_h2_d1 len=210 path=[0:0-206]
ACTATACATGAGGAGAACATAGAACAAAAATGGGACCATAGATATATAACAATAGAAGATATAGAGAACACAATAGACAACTTATTAGGAAAGAGGTGTGTCGTCATGGAGCTGATGTTCGAGGATACTTTGCATGGTCATTCTTGGATAATTTTGAGTGGGCTATGGGATACACCAAGAGGTTTGGCATTGTTTATGTTGATTATAAGAACGGGC

>H149xcV_ytR1oP_r3_h2_d1 len=306 path=[0:0-207]
ATTAGAGTCTGAGAGAGTCTTGATTTGTCGTCGTCGAGAAATATAGGAGATCTGATTAGAGGAGAGAGCGGCCTAGGCGATGCGCGATATAGCGCTATATAGGCCTAGAGGAGAGTCTCTCTCTTTTAGAAGAGATAATATATATATATATATGGCTCTCCGGCGGGGCCGCGCGAGAGCTCGATCGATCGATATTAGCTGTACGATGCTAGCTAGCTTATATTCGATCGATTATAGCTTAGATCTCTCTCTAAAGGTCGATATCGCTTATGCGCGCGTATATCG

I wish to reformat my file so that it only provides me with the unique gene id's for genes with a length greater than 250 bp.
My desired output is:
>H149xcV_Fge342_r3_h2
>H149xcV_ytR1oP_r3_h2
>H149xcV_DPN78333_r3_h2
>H149xcV_AgV472_r3_h2
>H149xcV_DNP733_r3_h2

**Tags:** python, phylogenetics, fasta, phylogeny, seqio
> **Comments:**
> **username_1**: note that after your edit, your code now does not match your error. You should update the error to the new error, otherwise we can't help you very well.  
> **username_0**: Hi @MaximilianPress I have updated the error!  
> **username_2**: I updated the post to attempt to trap the bugs.  

---

## 2 answers

### Answer by username_1 on 2020-11-23. Score: 1 | Accepted answer

You might consider changing the code to make the whitespace a little more consistent (as it was, it failed when i tried to run it).
Also, why are you using regular expressions? You have already extracted the gene_id using Biopython. The following works for me:
(updated to handle the underscore delimiting)
from Bio import SeqIO
import sys
import re 

fasta_file = (sys.argv[1])
for myfile in SeqIO.parse(fasta_file, "fasta"):
    if len(myfile.seq) > 250:  # note .seq here!
        gene_id = myfile.id
        # unclear why using regex
        #match_list = re.match('H149xcV\_\w+\_\w+\_\w+',gene_id)
        #print (">"+match_list.group(0)) 
        print("_".join(gene_id.split("_")[0:-1]))

> **Comments:**
> **username_0**: Hi @MaximilianPress , how would I change the regex so that it only provides me with `>H149xcV_Fge342_r3_h2` and not`>H149xcV_Fge342_r3_h2_d1`. I would not like the very end part that consists of `d1`. So basically, how can I format it so it it only provides this `>H149xcV_Fge342_r3_h2`. If I am using regex would I not need to use gene.id?  
> **username_2**: @andnowmywatchbegins wants to remove the stuff after the space in the fasta header. In phylogeny this is either removed or spaces substituted because the space in phylip format denotes the start of the sequence  
> **username_0**: @Michael I've tried reformatting the entire regular expression and I am still getting the full `>H149xcV_Fge342_r3_h2_d1`, is there a way to only receive `>H149xcV_Fge342_r3_h2` as in output? Thanks!  
> **username_2**: Can you put this as a separate question please? .. Yes you will but thats a different part of regex  
> **username_1**: @Michael stuff after the whitespace is already stripped out by biopython when you use the `.id`. this is one of the more annoying behaviors of biopython IMO, but in this instance it is useful. I've confirmed that my example code does this. It admittedly does not handle the underscore delimitation, which I missed. But that can be done with split much more simply.  
> **username_1**: @andnowmywatchbegins why not just split on `_` and only keep as many `_`-delimited fields as you want? Regex will work for this in theory but it's annoying to debug in cases like this.  
> **username_2**: @MaximilianPress I've put a response here .. https://bioinformatics.stackexchange.com/questions/14913/how-to-obtain-desired-output  
> **username_3**: @MaximilianPress "if len(myfile.seq) > 250:  # note .seq here!" -- `.seq` is actually not needed there  
> **username_1**: @Chris_Rands ah, good to know... another confusing feature of biopython!  

---

### Answer by username_2 on 2020-11-23. Score: 3

You wrote,
mylist = re.match(H149xcV\_\w+\_\w+\_\w+)

try...
myregex = re.compile(r'H149xcV\_\w+\_\w+\_\w+')
mylist = myregex.match(myfile.id)

or
mylist = re.match(r'H149xcV\_\w+\_\w+\_\w+',myfile.id)

Watch your indentation it should be 4 spaces. Note you are losing the last '_\w+', but don't think it matters.
I think it is better to use,
mylist, _, _ = re.split(r' ', myfile.id)

The problem with your code is list will just return true ... and that is not what you want. If you are using split carefully watch the number of ' ' in your code you can also use r'\s'
You can also set maxsplit as a parameter, which might be useful.

myfile not defined.
Please try,
fasta_file = (sys.argv[0])

Generally your argv command isn't cool and not just [0] versus [1]. I forget the argv module everyone uses .. there's two of them, they are a bit fiddle but are very cool of options. You way in is okay, okayish, sort of okay ... Anyway you appear to be requesting the second input into the commandline, wherea you are probably placing the fasta file in the first position.
Also
print (fasta_file)

Check something happens that you picked up the file.
The other way in is,
mypath = '/User/username/location/fasta.fa'
for myfile in SeqIO.parse(mypath, "fasta"):

where mypath is a OS X style, you're probably using Linux so its... /home/username/pathtofile/fastafile.fa (something like that) or
for myfile in SeqIO.parse('/User/username/location/fasta.fa', "fasta"):

I forgot .... don't ever use list as a variable, by mylist is fine. Again I've not debugged my code.

> **Comments:**
> **username_0**: Hi @Michael I tried doing that, but received a NameError indicating that the name 'myfile' is not defined. I appreciate your help!  
> **username_1**: @andnowmywatchbegins can you update your answer with this information?  
> **username_4**: `list` is used in Python for creating lists. I would recommend naming this variable something else.  
> **username_2**: `list` .... Yes!! Use `mylist` as a variable. instead  

---

