2017-05-22 4 views
0

"PB"findallのインスタンスとそれに続く数字ですが、私が呼び出すとしようとしています。Python。出力を返さない正規表現

number_all = re.findall(r'\bPB\b([0-9])\d+', ' '.join(number_list)) 

([0-9])\d+は出力を返しません。私は出力ファイルsequence.txtをチェックしますが、内部には何もありません。私がちょうどすれば\bPB\bそれは"PB"を出力しますが番号はありません。

私の入力ファイルは、raw-sequence.txtは次のようになります。

WB (19, 21, 24, 46, 60) 
WB (12, 11, 9, 23, 49) 
PB (18, 21, 10, 5, 5) 
WB (2, 14, 2, 29, 67) 
WB (1, 8, 1, 16, 52) 
PB (2, 11, 8, 3, 4) 

どのように出力次の行がsequence.txtすることができますか?ここで

PB (18, 21, 10, 5, 5) 
PB (2, 11, 8, 3, 4) 

は私の現在のコードです:

あなたが表示されたコードを考えると
sequence_raw_buffer = open('c:\\sequence.txt', 'a') 
with open('c:\\raw-sequence.txt') as f: 
    number_list = f.read().splitlines() 
    number_all = re.findall(r'\bPB\b([0-9])\d+', ' '.join(number_list)) 
    unique = list(set(number_all)) 
    for i in unique: 
    sequence_raw_buffer.write(i + '\n') 
    print "done" 
    f.close() 
    sequence_raw_buffer.close() 
+0

regex101.comを検索することができますthis

\bPB\s+\((?:\s*\d+\s*,\s*)*\d+\) 

を使用することができるための素晴らしいです正規表現のテスト – RandomHash

+0

['re'モジュールのドキュメント](https://docs.python.org/2/library/re.html)を実際に読んでください。 – user2357112

+0

「PB」で始まる行だけが必要ですか? –

答えて

2

、正規表現は、あなたの問題への過剰な合併症不要です。入力ファイルから行を繰り返して、line.startswith("PB")Trueを返すものをダンプするだけです。

with open(r'c:\raw-sequence.txt', 'r') as f, open(r'c:\sequence.txt', 'a') as sequence_raw_buffer: 
    for line in f: 
     if line.startswith("PB"): 
      print(line, file=sequence_raw_buffer) 

これは、ファイルが行ごとに繰り返されるという事実を示しています。 forループが取り除かれる正しい行ターミネータを追加するので、私は印刷を使用して行をダンプします。

この例では、複数のコンテキストマネージャを単一のwithブロックに配置する方法も示しています。 I/Oエラーは両方向で発生する可能性があるため、入力または出力のいずれの場合でも、すべてのファイルをwithブロックに入れる必要があります。今

、あなたは練習のために正規表現を使用しようとしているか、次のように試合はあなたがここに提示するものよりも、本当に複雑ですので、あなたが

PB\s*\((?:\d+,\s*)*\d+\) 

を試すことができます。これは、一致した場合:

  • スペース\s*
  • リテラルオープン括弧のリテラルPB
  • オプションの数は無制限\(
  • 任意の非捕捉基(?:)*は、
    • 少なくとも一桁\d+
    • リテラルコンマ,
    • スペースで\s*
  • 任意の数を含む、必要な回数繰り返します少なくとも1つの実際の番号\d
  • リテラル閉じ括弧\)

私は一緒に全体のファイルを連結して、式が複数行にまたがることができない限り、しかしその上findallを使用して気にしないでしょう。

pattern = re.compile('PB\s*\((?:\d+,\s*)*\d+\)') 
... 
      if pattern.match(line): 
... 

プリコンパイルパターン一度プログラムの実行を行いますすべてが、私は考えることができるいくつかの例、テキストデータは、一般的に改行で区切られますにので、私は、まだ上記のようなアプローチを使用することを好むだろう毎回re.match(..., line)と呼ぶこともできます。

+0

ああ、私はあなたがこれを書いた時にほぼ同じように自分自身でこれをコーディングしました。あなたが印刷を使用しているかどうか(改行が多すぎるかどうかにかかわらず)、または複数の改行(例えば、異なるファイルを使って)を複数回実行している場合、出力が改行についてダムであることに注意したい書き込み(十分ではない)。 forループや 'print( ''、file = outputFile)'の外側、 'outputFile.write(line)'の中で 'print(line、file = outputFile、end = '')' 'insideと' outputFile.write( "\ n") 'の外側にあります。 –

0

あなたは、この正規表現を試すことができます:PB \ S \(([0-9] *、\ S)* \?)

+0

これは、OPの入力ファイルで実行すると '[''、 '']'を返すように見えます。 – Kevin

+0

私はここでそれを試しました、それは動作するようです、https://regex101.com/r/GtqFJg/1。 使用しているテキストを私に送信できますか? –

+0

さらに、ここでは出力を示す対話的な環境の文字列もあります:https://repl.it/IOFL – Kevin

0

あなたは

  1. 含まれていない点がいくつかあります?単語境界(\b)と括弧の間にスペースがありません(
  2. 括弧()は、正規表現コンテキストでは異なる意味を持ちます。カッコはキャプチャグループを示します。文字通り括弧に一致するには、それをエスケープする必要があります。今

あなたは予定の正確なパターンに一致するように、あなたはPBを持つ唯一のマッチラインにしたい場合は、直接PB