我有一大堆字母乱七八糟,长达1.2k行。 我试图在它的两边找到一个小写字母,上面只有三个大写字母。
这是我到目前为止所拥有的
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
但现在我陷入了下一步的困境。我想要实现的是在for-loop
范围内创建(-3,4)
并检查每个字母是否为大写。实际上,如果小写字母的两侧都有三个大写字母,则将其打印出来。
例如
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.
如果这没有意义,如果代码按预期工作,这将是一个示例输出
scramble("abcdEFGhIJKlmnop")
输出
EFGhIJK
一个小写字母,两边都有三个大写字母。
答案 0 :(得分:1)
这是一种“Python”无需执行此操作的方法 正则表达式:
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)
答案 1 :(得分:1)
如果你不能使用正则表达式
也许这个for循环可以做到这一点
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
答案 2 :(得分: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列出的所有条件。
(删除了我以前的所有代码,因为它通常是*坏*)