2016-08-26 3 views
0

私は大量の文字列をすべて混乱させ、1.2k行の長さを持っています。 私は、その両側に大文字の3文字の小文字を見つけようとしています。列挙子の中にネストされた複数の 'if'ステートメントの使い方は?

これは私がこれまで

def scramble(sentence): 
    try: 
     for i,v in enumerate(sentence): 
      if v.islower(): 
       if sentence[i-4].islower() and sentence[i+4].islower(): 
    .... 
    .... 
    except IndexError: 
     print() #Trying to deal with the problem of reaching the end of the list 


#This section is checking if 
the fourth letters before 
and after i are lowercase to ensure the central lower case letter has 
exactly three upper case letters around it 

しかし、今、私は次のステップにこだわっています持っているものです。私が達成したいのは、(-3,4)の範囲のfor-loopを作成し、これらの文字のそれぞれが大文字であることを確認することです。実際に小文字の両側に3つの大文字がある場合は、これを印刷します。

、これは理にかなっていない場合は、コードが期待

scramble("abcdEFGhIJKlmnop") 

OUTPUT

EFGhIJK 

一つ小文字として働いていた場合、これは出力例だろう

for j in range(-3,4): 
    if j != 0: 
     #Some code to check if the letters in this range are uppercase 
     #if j != 0 is there because we already know it is lowercase 
     #because of the previous if v.islower(): statement. 

たとえば、大文字の3桁の英字。ここで

+4

を(それは* *一般的に悪かったとしてすべての私の前のコードを削除しますか)? – jsfan

+0

うわー、人々はまだPython Challengeをプレイしていますか?クールな豆、と申し訳ありませんフォーラム以来、スパムボットによってオーバーランされています。 –

+0

私はそれを見つけたので、私はgo @MartijnPietersを持っていると思っていましたが、残念なことにフォーラムはうまくいきません。 – oneman

答えて

1


正規表現せずにそれを "Pythonically" を行う方法である:

s = 'abcdEFGhIJKlmnop' 

words = [s[i:i+7] for i in range(len(s) - 7) if s[i:i+3].isupper() and s[i+3].islower() and s[i+4:i+7].isupper()] 
print(words) 

、出力は次のとおりです。

['EFGhIJK'] 

そして、ここではでそれをを行う方法であります正規表現、
ですが、よく、またPythonic :-)

import re 
words = re.findall(r'[A-Z]{3}[a-z][A-Z]{3}', s) 
+0

私は正規表現を見たことがないので、私は意味が分かりませんが、他の人が役に立つと確信しています – oneman

+1

@Liam Regexenはツールすべてのプログラマーのツールキットで。あなたはいつもそれらを使う必要はありませんが、しばらくの間、彼らは正確な正しい解決策です。彼らに学びなさい。 – deceze

+1

@LiamEmery:正規表現(別名正規表現)は、あるパターンのパターンを見つけるのには非常に優れているので、正規表現に精通していることをお勧めします。多くのプログラミング言語は正規表現機能を提供しており、regexのコア構文はある言語から他の言語に大きく変わっていないので、Pythonで正規表現を知っていれば、他の言語でも正規表現を使いやすくなります。 –

1

あなたは多分これがループのためにトリックを行うことができます正規表現

を使用できない場合は、

if v.islower(): 
    if sentence[i-4].islower() and sentence[i+4].islower(): 
     for k in range(1,4): 
      if sentence[i-k].islower() or sentence[i+k].islower(): 
       break 
      if k == 3: 
       return i 
+0

ニース。 'if k == 3:'の代わりに 'for'ループに' else'節を使うことができます。 –

1

正規表現は、説明するために@Israel Untermanの回答の修正版を使用して、おそらく最も簡単です外側のエッジと非アッパー周囲フル正規表現は次のようになります。(?:.)グループを使用して

s = 'abcdEFGhIJKlmnopABCdEFGGIddFFansTBDgRRQ' 

import re 
words = re.findall(r'(?:^|[^A-Z])([A-Z]{3}[a-z][A-Z]{3})(?:[^A-Z]|$)', s) 

# words is ['EFGhIJK', 'TBDgRRQ'] 

があることから、ラインまたは非アッパーの始まりの検索を続けますマッチグループに含まれ、目的のトークンのみを結果リストに残します。これは、OPによって列挙されたすべての条件を考慮する必要があります。正規表現を使用しないのはなぜ

関連する問題