-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

这将找到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 回答
0

python 的众多好处之一是正则表达式。python中的正则表达式可以通过导入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} 定义的三个大写字母出现之前不想要任何大写字母。

接下来是([a-z]). 这就是您如何定义中间的单个小写字母。注意它旁边没有 {x}。这是因为我们只希望出现一次。例如 :'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 回答