-2

したがって、これが非常に汚いコードであり、おそらく非効率的なコードであることはわかっていますが、それを機能させることができるかどうかを確認しようとしていました. なぜ機能しないのかわかりません...アクセスしているファイルのテキストは、http://www.pythonchallenge.com/pc/def/equality.htmlのソースにあります。何か助けはありますか?

#! /usr/bin/python

# This program searches a string for a lowercase letter that has 3, and only 3,
# uppercase letters to the left of it, and 3, and only 3, uppercase letters to
# the right of it. It then returns that lowercase letter.

from string import lowercase
from string import uppercase

# Open the text file containing the string and set it to variable str
fileHandle = open ( 'bodyguards.txt', 'r' )
str = fileHandle.read()
fileHandle.close()
#str = 'BIGaBIGaBIGaBIG'

# Search for a lowercase letter.
def isitlower(str):
    for a in str :
        if a in lowercase:
            letterposition = str.index(a) 
            r =threebgright(letterposition)
            l =threebgleft(letterposition)
            if r !=None and l !=None:
                print l,":",a,":", r

def threebgright(letterposition):
    if str[letterposition + 1] in uppercase and str[letterposition +2] in uppercase and         str[letterposition + 3] in uppercase and str[letterposition + 4] not in uppercase:
        return str[letterposition+1], str[letterposition+2], str[letterposition+3]
    else:
        return None

def threebgleft(letterposition):
    if str[letterposition - 1] in uppercase and str[letterposition -2] in uppercase and     str[letterposition - 3] in uppercase and str[letterposition - 4] not in uppercase:
        return str[letterposition-1], str[letterposition-2], str[letterposition-3]
    else:
        return None

isitlower(str)
4

2 に答える 2

0

Python の多くの利点の 1 つは、正規表現です。Python の Regex は re モジュールをインポートすることでアクセスできます。あなたの答えは複雑すぎて、面倒で非効率的です。KISS に従うのが最善です (シンプルで小さくしてください)。簡単な解決策は次のとおりです。

data = " All that huge text "

bodyguarded = re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]')
print "".join(bodyguared)

説明

[^A-Z]

小さい文字の周りにちょうど3 つの大きな文字があることに注意してください。これを外せば「SJDHjHDG」などが正解になる。これが基本的に行っていることは、[AZ]{3} で定義された3 つのキャップが発生する前に、キャップが必要ないということです。

次は([a-z])。これは、中央の単一の小文字を定義する方法です。横に {x} がないことに注意してください。これは、出現回数を1 回だけにしたいためです。たとえば、 :'ABCjjKLM'は正しくありません。途中の小文字が複数あるためです。

小文字を囲う必要があるため、右側にさらに 3 つのオカレンス( [A-Z]{3}) が必要ですが、それ以上は必要ないため、 を追加し[^A-Z]ます。'AJDkKLKM' 前に説明したように、または のようなケース'JHKHjLKKK'は正しくありません。大文字は 3 回しか出現しないためです。これは、3 つの大文字 ( [A-Z]{3}) の後に、A から Z の範囲内の文字以外の文字が有効であることを示しています。

最後にあるのはprint "".join(bodyguard)

読みやすさのためにこれを行いました。

re モジュールの findall 関数は、結果をリストで返します。そうした場合、print bodyguard次のような結果が得られます。[x,y,z,r,q,i] 代わりに、リストのすべての要素が空'xyzrqi'の文字列で結合されているため、得られます。""

私が助けてくれることを願っています。

于 2013-12-25T12:17:29.480 に答える
0

これは、str で a が最初に出現するインデックスを見つけます。

letterposition = str.index(a)

おそらくあなたが望むものではありません。正しい方法は、次を使用することenumerateです。

def isitlower(my_str):
    for a, letter_position in enumerate(my_str):
        if a in lowercase:
            r =threebgright(letterposition)
            l =threebgleft(letterposition)
            if r !=None and l !=None:
                print l,":",a,":", r

組み込み型/関数なstrので、変数名として使用しないことをお勧めします

于 2012-11-30T05:03:17.823 に答える