【问题标题】:looking for specific patterns between two strings in python - fastq file - sequencing reads在 python 中寻找两个字符串之间的特定模式 - fastq 文件 - 测序读取
【发布时间】:2017-06-20 15:13:34
【问题描述】:

我正在尝试用 python 编写一个代码来帮助我在两个特定字符串之间寻找一个字符串。当我用单个字符串实现代码时,我得到了所需的输出。但是,我需要匹配序列数组中的模式。它一直给我一个错误。

定义一个函数来查找两个用户指定序列之间的模式:

import re
def find_between(prefix, suffix, text):
pattern = r"{}\s*(.*)\s*{}".format(re.escape(prefix), re.escape(suffix))
result = re.search(pattern, text, re.DOTALL)
if result:
    return result.group(1)
else:
    return None

当我尝试单个字符串时,它可以工作:

text = "AGGTCCTGTAAACCT"
prefix = "TCCT"
suffix = "ACCT"
find_between(prefix, suffix, text)

输出:'GTAA'

但是当我尝试读取 fastq 文件并执行搜索时,却没有:

seqs = readFastq('FN1.fastq')

text = seqs
prefix = "TCCT"
suffix = "ACCT"
find_between(prefix, suffix, text)

它抛出了这个错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-9c35672e7561> in <module>()
  2 prefix = "TCCT"
  3 suffix = "ACCT"
----> 4 find_between(prefix, suffix, text)

<ipython-input-19-5f42599c717f> in find_between(prefix, suffix, text)
  3 def find_between(prefix, suffix, text):
  4     pattern = r"{}\s*(.*)\s*{}".format(re.escape(prefix),     re.escape(suffix))
----> 5     result = re.search(pattern, text, re.DOTALL)
  6     if result:
  7         return result.group(1)

/Users/shravantikrishna/anaconda/lib/python3.6/re.py in search(pattern, string, flags)
180     """Scan through string looking for a match to the pattern, returning
181     a match object, or None if no match was found."""
--> 182     return _compile(pattern, flags).search(string)
183 
184 def sub(pattern, repl, string, count=0, flags=0):

TypeError: expected string or bytes-like object

【问题讨论】:

  • 文本变量可能不是字符串或字节。如果你打印出类型(文本),你会得到什么?您可以在调用 find_between...之前将“文本”转换为实际的字符串或字节对象...
  • 还是不行。另外,您知道如何允许前缀和后缀中最多两个字母不匹配吗?在实际情况下,后缀和前缀将是同一个字符串。

标签: python pattern-matching jupyter-notebook fastq sequencing


【解决方案1】:

在这种看似简单的情况下,我不会使用正则表达式进行匹配。如果您对查找前缀和后缀之间的文本感兴趣,可以使用: 结果 = text.lstrip(prefix[:2]).rstrip(suffix[:2]) 但是你没有说前缀和后缀中哪2个字符不需要匹配。

这里有一些示例代码和数据...

text = 'XXsome data that needs to be parsedXX'
prefix = 'XXYY'
suffix = 'XXYY'
result = text.lstrip(prefix[:2]).rstrip(suffix[:2])
print(result)

some data that needs to be parsed

【讨论】:

  • 谢谢!需要明确的是,我有一个序列 - 比如说 ATGC,在两个序列 AGGCCCCC 和 AGGCCCCC 之间。即使任何两个字母在 AGGCCCCC 中不匹配,我也想提取 ATGC。上面的代码不起作用,因为它没有考虑任何位置的不匹配。
  • 我会收回我所说的不需要正则表达式的说法,因为听起来您在文本和前缀/后缀中可能面临更大的数据可变性。所以这会让您重新审视readFastq('FN1.fastq') 返回什么类型的对象以查看正则表达式引发异常的原因。似乎它在抱怨也是 seqs 的文本。
  • 是的,我认为这可能是问题所在。因为当我使用一个字符串时,它可以工作,即使使用两个字符串,它也会给我这个错误。有没有办法让它读取字符串数组并将结果作为列表返回?
猜你喜欢
  • 2012-07-28
  • 2021-03-13
  • 2021-12-11
  • 2016-11-20
  • 2018-12-07
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多