我正在研究Python挑战赛,我正在上课要求我们找到一个小写字母,两边用三个大写字母包围。我写了下面的代码,看起来很粗糙,但我觉得应该工作。但是,我得到的只是一个空字符串。
source="Hello there" #the string I have to work with
key=""#where I want to put the characters that fit
for i in source:
if i==i.lower(): # if it's uppercase
x=source.index(i) #makes number that's the index of i
if source[x-1].upper()==source[x-1] and source[x-2]==source[x-2].upper() and source[x-3].upper()==source[x-3]: #checks that the three numbers before it are upper case
if source[x+1].upper()==source[x+1] and source[x+2].upper()==source[x+2] and source[x+3].upper()==source[x+3]: #checks three numbers after are uppercase
if source[x+4].lower()==source[x=4] and source[x-4].lower()==source[x-4]: #checks that the fourth numbers are lowercase
key+=i #adds the character to key
print(key)
我知道这真的非常混乱,但我不明白为什么它只返回一个空字符串。如果你知道什么是错的,或者更有效的方法,我会非常感激。感谢
答案 0 :(得分:0)
使用正则表达式,这要容易得多。
re.findall(r'(?<![A-Z])[A-Z]{3}([a-z])(?=[A-Z]{3}(?:\Z|[^A-Z]))', text)
以下是它的工作原理:
(?<![A-Z])
是一个负面的后置断言,它确保我们前面没有大写字母。
[A-Z]{3}
是三个大写字母。
([a-z])
是我们正在寻找的小写字母。
(?=[A-Z]{3}(?:\Z|[^A-Z]))
是前瞻断言,确保我们后跟三个大写字母,但不是四个。
您可能需要根据实际想要查找的内容更改分组。这会找到小写字母。
答案 1 :(得分:0)
我建议使用itertools.groupby
方法和keyfunc
来区分小写字母和大写字母。
首先,你需要一个辅助函数来重构检查逻辑:
def check(subseq):
return (subseq[0][0] and len(subseq[0][1]) == 3
and len(subseq[1][1]) == 1
and len(subseq[2][1]) == 3)
然后分组并检查:
def findNeedle(mystr):
seq = [(k,list(g)) for k,g in groupby(mystr, str.isupper)]
for i in range(len(seq) - 2):
if check(seq[i:i+3]):
return seq[i+1][1][0]
检查解释器中的seq
以查看其工作原理,应该非常清楚。
编辑:有些拼写错误,我没有测试代码。
现在进行测试:
>>> findNeedle("Hello there HELxOTHere")
'x'