0

私は2つの特定の文字列間の文字列を探すのに役立つコードをPythonで記述しようとしています。単一の文字列でコードを実装すると、目的の出力が得られます。しかし、配列の配列にパターンをマッチさせる必要があります。それは私にエラーを投げつけ続けます。私は単一の文字列をしようとすると、 Pythonの2つの文字列間の特定のパターンを探しています - fastqファイル - シーケンシングの読み込み

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) 

出力:2人のユーザー指定された配列との間のパターンを探すために、関数を定義する

'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 
+0

です。タイプ(テキスト)を印刷するとどうなりますか? find_betweenを呼び出す前に 'text'を実際の文字列またはバイトオブジェクトに変換することができます... –

+0

それでも動作しません。また、どのように接頭辞と接尾辞に2文字までの不一致を許すことができるか知っていますか?実際の場合、接尾辞と接頭辞は同じ文字列になります。 – user8033590

答えて

0

私は、このエラーがスローされます。接頭辞と接尾辞の間にテキストを見つけることに興味がある場合は、 result = text.lstrip(接頭辞[: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 
+0

ありがとう!明確にするために、私は2つの配列AGGCCCCCとAGGCCCCCの間に1つの配列、例えばATGCを持っています。私はAGGCCCCCで2つの文字が一致しなくても、ATGCを抽出したいと思います。上記のコードは、どの位置でも不一致を考慮していないため動作しません。 – user8033590

+0

正規表現が必要ないと言ったことを取り戻しますが、テキストと接頭辞/接尾辞の両方でデータの変動が大きくなる可能性があるように思えます。そのため、どのタイプのオブジェクトreadFastq( ' FN1.fastq ')は、regexが例外をスローしている理由を返します。それはまたseqsであるテキストについて不平を言っているようです。 –

+0

はい、私はそれが問題であると思います。なぜなら、私が1つの文字列を使用すると、それは機能し、2つの文字列であっても、それは私にそのエラーを投げます。私はそれが文字列の配列を読んで結果をリストとして返すことができる方法はありますか? – user8033590

関連する問題