Python挑战3级-使用字符串切片解决

时间:2019-01-26 10:55:54

标签: python python-3.x

很抱歉张贴问题,其他问题也已回答。但是,无法弄清楚此解决方案出了什么问题。这个问题需要找到在每边都被3个大写字母包围的小写字母。我写的代码:

q = ''
for i in range(4,len(x)-4):
    if x[i].islower() and x[i-4].islower() and x[i+4].islower() and x[i-3:i].isupper() and x[i+1:i+4].isupper()  :
        q+=x[i]


print(q)

我得到的字符串是

  

'lgvcaaginbkvsoezhtlnldslyitlooqfgiksudtm'   vs“链表”

感谢您的帮助。

编辑:由于某种原因,以下代码似乎可以正常工作:

q = ''
for i in range(4,len(x)-4):
    if x[i].islower() and x[i-4].islower() and  x[i-3:i].isupper() and x[i+1:i+4].isupper() and x[i+4].islower():
        q+=x[i]

print(q)

3 个答案:

答案 0 :(得分:1)

这将是切片解决方案:

t = "This is some TEXtTHAt will result in one true result"

def notupper(x): 
    return not x.isupper()

yep = []
# lookup function to execute inside all()
terms = {0:notupper, 8:notupper, 4:notupper}

for part in (t[i:i+9] for i in range(len(t)-7)):
    if len(part)<9:  # fix for XXXxXXX at end of string
      part = (part+"  ")[:9]
    if all(terms.get(index,str.isupper)(ch) for index,ch in enumerate(part)):
        print("Statisfies all terms: ", part)

它将文本切成9个字符的部分(您需要9来确保没有XXXXyXXXX-您需要在下半部周围恰好三个上半部。

它在位置0,8和4上检查notupper的切片文本:

XXXXxXXXX
012345678
lUUUlUUUl   # must statisfy: l=notupper and U=isupper
通过从terms词典中提取此功能来

part中所有没有匹配关键字的索引terms使用str.isupper的默认参数与terms.get(index,str.isupper)进行测试

all()确保所有测试都需要评估为true才能输入if条件。

对于isupper和islower(),空格的求值为False

阅读:


您可以将dict/all部分替换为:

# the ( .. ) are needed to enable line breaking - you could use \ as well
if notupper(part[0]) and notupper(part[8]) and notupper(part[4]) and (
    part[1].isupper() and part[2].isupper() and part[3].isupper() and
    part[5].isupper() and part[6].isupper() and part[7].isupper()):
    print("Statisfies all terms: ", part)

如果这对于您当前的python级别而言太复杂了。

答案 1 :(得分:1)

您要尝试的是匹配一个模式:不上,上,上,上,不上,上,上,上,不上。如果对字符串使用签名,则更容易捕获:

>>> t = "This is some TEXtTHAt will result in one true result"
>>> sig = "".join("U" if c.isupper() else "l" for c in t)
>>> sig
'UllllllllllllUUUlUUUllllllllllllllllllllllllllllllll'

您正在lUUUlUUUl字符串中寻找sig子字符串。 Python没有findall的内置函数,但是您可以迭代find的结果:

>>> result = ""
>>> i = sig.find("lUUUlUUUl")
>>> while i != -1: # find != -1 means that the substring wasn't found
...     result += t[i+4] # the center `l` 
...     i = sig.find("lUUUlUUUl", i+4) # we can start the next search at the center `l`
... 
>>> print( result )
t

您也可以将re.finditer与正则表达式一起使用,但更为复杂。

答案 2 :(得分:-1)

文本在每行末尾都有换行符“\n”。您需要用空字符串替换所有“\n”字符。这可以使用 RegEx(正则表达式)模块来完成。添加这些代码行,它将起作用:

const PostSchema = new mongoose.Schema(
  {
    userId: {
      type: String,
      required: true,
    },
    desc: {
      type: String,
      max: 500
    },
    img: {
      type: String,
    },
    likes: {
      type: Array,
      default: [],
    },
  },
  { timestamps: true }
);