2016-06-13 10 views
0

私は、与えられたデータセットの文字の数を数えることができるプログラムで作業しました。>chromeから始まり、その後に長い連鎖の文字の(a,b,c,d at random)で始まります。 データのチャンクは、まさにこのようになります。私は、各>chrome後に表示される文字の数をカウントする特定の文字列で始まるデータの一部を反復する

("\n" shows space in the command line): ">chrome0001"\n"abcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011" \n"bbbbadbcbabdbaaaadbcbddcdda>chrome0111"\n" .... (the total number of ">chrome" is 10)."

。そして、期待される出力は次のようにする必要があります。

>>chrome0001 a:4 b:6 c:10 d: 11

私はプログラムが働いて取得する\n>chromeを使用することができるかどうかについて考えてきたが、捕まってしまったと掘るためだけに、このウェブサイトに多くの質問と回答を研究しました誰かがこれで私を助けてくれますか?

+0

あなたが必要なものを把握できるように入力と希望する出力を記述してください。 – Brian

+0

確かに、ありがとう。私は各>クロムタグとその下にある文字の数を印刷したいと思います。私が知りたいのは、クロムに遭遇するたびにカウントプロセスを繰り返す方法だけです。 –

+1

'

答えて

1

これは比較的単純な前方解析問題です。まず、文字列をchromeXYZ\nビットに分割し、それを次の文字列でグループ化するとします。私たちは、正規表現でかなり簡単にこれを行うことができます - ここで私が正しくあなたの入力を理解していれば動作するものがあります:

>>> import re 
>>> s = ">chrome0001\nabcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011\nbbbbadbcbabdbaaaadbcbddcdda>chrome0111\n" 
>>> re.findall(r'(>chrome\d+\n)([^>]+)', s) 
[('>chrome0001\n', 'abcdbadbcbdabdcbdbbbbadbcbbdab'), ('>chrome0011\n', 'bbbbadbcbabdbaaaadbcbddcdda')] 

正規表現がストレート前方(少なくとも限り正規表現が行くように...)です。

  • (>chrome\d+\n) - 「>クローム」、いくつかの数字、および改行
  • ([^>]+) - 次>または入力が終了するまで、すべての文字にマッチします。

ここから、サブシーケンスの文字数のカウントはかなり簡単です。

>>> from collections import Counter 
>>> for chrome, alpha in re.findall(r'(>chrome\d+\n)([^>]+)', s): 
... print(chrome, Counter(alpha)) 
... 
('>chrome0001\n', Counter({'b': 14, 'd': 7, 'a': 5, 'c': 4})) 
('>chrome0011\n', Counter({'b': 10, 'a': 7, 'd': 7, 'c': 3})) 
+0

もちろん、PythonにはCounterクラスがあります! –

+0

@AaronTaggart - FWIW、python2.7までは追加されていませんでした(これは数年前からありましたが、言語の寿命の大半は間違いありません:) – mgilson

関連する問題