无论大小写在一个更长的字符串中查找字符串(并确定哪种情况)

时间:2015-02-19 06:32:27

标签: python mixed-case

我对python和编程很新,我目前正在Grok Online上进行在线课程。目前我被困在第二个课程(机器人在线!),因为简要的是设计一个程序,读取一行文字并打印出机器人是否出现,尽管它必须弄清楚这个单词是否是小写的,大写或混合大小写。这是我迄今为止的解决方案:

text = input('Line: ')

if 'robot' in text:
  print('There is a small robot in the line.')

elif 'robot'.upper() in text:
  print('There is a big robot in the line.')

elif 'robot' or 'ROBOT' != text.isupper() and not text.islower():
  print('There is a medium sized robot in the line.')

else:
  print('No robots here.')

另一件事是程序必须将单词区分为单个字符串,因此它会为'机器人'打印True,但对'strobotron'打印为false。

5 个答案:

答案 0 :(得分:1)

您的第二个elif声明应为

elif 'robot' in text.islower() and not ('ROBOT' in text or 'robot' in text):

如果你想在一行中完成所有这些。

对于第二个要求,您可以使用正则表达式word boundary anchors

import re
if re.search(r"\brobot\b", text, flags=re.I):
    if re.search(r"\brobot\b", text):
        print('There is a small robot in the line.')
    elif re.search(r"\bROBOT\b", text):
        print('There is a big robot in the line.')
    else:
        print('There is a medium sized robot in the line.')
else:
    print('No robots here.')

答案 1 :(得分:1)

我假设您的输入最多包含一个机器人字符串。

>>> def findrobot(text):
        if 'robot' in text:
            print('There is a small robot in the line.')
        elif 'robot'.upper() in text:
            print('There is a big robot in the line.')
        elif re.search(r'(?i)robot', text):
            if 'robot' not in text and 'ROBOT' not in text:
                print('MIxed cased robot found')
        else:
            print('No robots here.')


>>> text = input('Line: ')
Line: robot
>>> findrobot(text)
There is a small robot in the line.
>>> text = input('Line: ')
Line: ROBOT
>>> findrobot(text)
There is a big robot in the line.
>>> text = input('Line: ')
Line: RobOt
>>> findrobot(text)
MIxed cased robot found
>>> text = input('Line: ')
Line: foo
>>> findrobot(text)
No robots here.

答案 2 :(得分:1)

这可以处理标点符号并避免匹配strobotron:

text = input('Line: ')

text = text.replace('.,?;:"', ' ')
words = text.split()
lowers = text.lower().split()

if 'robot' in words:
  print('There is a small robot in the line.')
elif 'robot'.upper() in words:
  print('There is a big robot in the line.')
elif 'robot' in lowers:
  print('There is a medium sized robot in the line.')
else:
  print('No robots here.')

答案 3 :(得分:1)

有很多方法可以解决这个问题。正则表达式是其中一种工具。考虑到这是你的第二个编程课程我建议不要使用正则表达式。相反,我会尝试使用更基本的python工具和概念。

首先将字符串拆分为空格:

words = text.split()

这会将字符串'I am a robot'拆分为单词列表:['I', 'am', 'a', 'robot']。请注意,这不会拆分标点符号。 'I am a robot.'将成为['I', 'am', 'a', 'robot.']。注意末尾的点'robot.'。对于其余的答案,我会假装没有标点符号,因为这会使事情超出第二个编程课程的范围。

现在,您可以为words过滤'robot',无论如何:

robots = []
for word in words:
  if word.lower() == 'robot':
    robots.append(word)

这个循环也可以这样写:

robots = [word for word in words if word.lower() == 'robot']

这称为列表推导,基本上只是一种简单的方法来编写一个循环,将列表中的某些项目收集到另一个列表中。如果你还没有学过列表理解,那么就忽略这部分。

从输入'I am a robot and you are a ROBOT and we are RoBoT but not strobotron'开始,列表robots将为['robot', 'ROBOT', 'RoBoT']'strobotron'不在列表中,因为它不等于'robot'。这解决了找到'robot'而不是'strobotron'的问题。

如果robots列表为空,那么您就知道根本没有机器人。如果它不是空的,那么你可以检查小型或大型或中型机器人。

if not robots:
  print('No robots here.')
elif 'robot' in robots:
  print('There is a small robot in the line.')
elif 'ROBOT' in robots:
  print('There is a big robot in the line.')
else:
  print('There is a medium sized robot in the line.')

第一个条件(if not robots:)正在使用一种叫做隐式booleanes的python机制。几乎任何东西都可以在这样的if条件中使用,它将被隐式转换为布尔值。在大多数情况下,如果事情是"空"这将被视为虚假。

请注意if else链中条件的顺序。您必须首先检查空列表,否则其他部分将无法工作。逻辑如下:如果列表不为空并且列表中没有小型或大型机器人,则列表中的任何机器人必须是中等的。


您的问题描述存在歧义。如果线路中同时存在小型和大型(和中型)机器人,该怎么办?它应该同时报告吗?如果两者都在一致,则当前代码将仅报告小型机器人。这是因为它首先检查一个小机器人然后跳过其余的(这是elif的语义)。

要报告小型和大型(和中型)机器人,您可以这样做:

smallrobots = []
largerobots = []
mediumrobots = []
for robot in robots:
  if robot == 'robot':
    smallrobots.append(robot)
  elif robot == 'ROBOT':
    largerobots.append(robot)
  else:
    mediumrobots.append(robot)

if not robots:
  print('No robots here.')
if smallrobots:
  print('There is a small robot in the line.')
if largerobots:
  print('There is a big robot in the line.')
if mediumrobots:
  print('There is a medium sized robot in the line.')

请注意,elif现在只在循环内部。仅使用if进行报告意味着如果找到小型机器人,它将不会跳过中型机器人。

额外奖励:您现在甚至可以区分出是否有一个或多个小型机器人:

if len(smallrobots) == 1:
  print('There is a small robot in the line.')
elif len(smallrobots) > 1:
  print('There are small robots in the line.')

答案 4 :(得分:0)

这是另一种使用python集合的方法

from collections import Counter

def get_words(text, line=""):
    lower_case, upper_case = text.lower(), text.upper()
    data = {'lower' : 0,'upper' : 0, 'mix' : 0}
    cnt = Counter()
    for word in line.split():
        cnt[word]+=1
    if cnt.has_key(lower_case):
        data['lower'] = cnt[lower_case]
        cnt.pop(lower_case)
    if cnt.has_key(upper_case):
        data['upper'] = cnt[upper_case]
        cnt.pop(upper_case)
    for x, y in cnt.iteritems():
        if x.lower()==lower_case:
            data['mix'] += y
    return data

它为您提供了文本计数

get_words('robot', line="i am a robot with Robot who has a ROBOT")

结果:

{'lower': 1, 'mix': 1, 'upper': 1}