【问题标题】:how to search for a capital letter within a string and return the list of words with and without capital letters如何在字符串中搜索大写字母并返回带和不带大写字母的单词列表
【发布时间】:2011-07-06 19:54:29
【问题描述】:

我的家庭作业是编写一个程序,该程序从用户那里读取一个字符串并从输入中创建一个单词列表。创建两个列表,一个包含至少包含一个大写字母的单词和一个单词不包含任何大写字母。 使用单个 for 循环打印出其中包含大写字母的单词,然后是其中没有大写字母的单词,每行一个单词。

我知道的不正确:

s= input("Enter your string: ")
words = sorted(s.strip().split())
for word in words:
    print (word)

因为它仅在 Capitol 在第一个字符中时对序列进行排序。对于这个分配,一个字符可以出现在一个单词中的任何位置。如,'tHis is a sTring'

我正在玩一个看起来与此类似的解决方案,只是想看看我是否可以将带有 CAPS 的单词弄出来..但它只是不起作用:

    s = input("Please enter a sentence: ")
while True:
    cap = 0
    s = s.strip().split()
    for c in s:
        if c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
            print(c[:cap])
            cap += 1
    else:
        print("not the answer")
        break 

但正则表达式可能比写出整个字母表做得更好。

非常感谢任何帮助。不用说我是 python 新手。

【问题讨论】:

  • +1。我想 -1 是因为这是家庭作业,但 casper 正在尝试完成这项工作并发布了代码。我认为没有必要投反对票。
  • 在拆分之前不需要使用strip,因为split会自动去除多余的空格。

标签: python string


【解决方案1】:
>>> w = 'AbcDefgHijkL'
>>> r = re.findall('([A-Z])', word)
>>> r
['A', 'D', 'H', 'L']

这可以为您提供一个单词中所有大写字母...只是分享这个想法

>>> r = re.findall('([A-Z][a-z]+)', w)
>>> r
['Abc', 'Defg', 'Hijk']

上面会给你所有以大写字母开头的单词。注意:最后一个没有被捕获,因为它不会发出一个单词,但即使是那个也可以被捕获

>>> r = re.findall('([A-Z][a-z]*)', w)
>>> r
['Abc', 'Defg', 'Hijk', 'L']

如果在单词中找到大写字母,则返回true:

>>> word = 'abcdD'
>>> bool(re.search('([A-Z])', word))

【讨论】:

    【解决方案2】:

    提示:“创建两个列表”

    s= input("Enter your string: ")
    withcap = []
    without = []
    for word in s.strip().split():
        # your turn
    

    您使用 for .. else 的方式是错误的 - 当循环中没有 break 时会执行 else 块。您尝试执行的逻辑如下所示

    for c in s:
        if c.isupper():
            # s contains a capital letter
            # <do something>
            break # one such letter is enough
    else: # we did't `break` out of the loop
        # therefore have no capital letter in s
        # <do something>
    

    你也可以用any写得更短

    if any(c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" for c in s):
         # <do something>
    else:
         # <do something>
    

    【讨论】:

    • @casper 提示 #2 - s.strip().split() 返回什么?
    • 如果您不介意特定于区域设置,您可以将那个巨大的 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 位更改为 string.uppercase
    【解决方案3】:

    对于问题的第一部分,听起来像正则表达式会更容易(只寻找 [A-Z] 的正则表达式应该可以解决问题)。

    对于第二部分,我建议使用两个列表,因为这是在一个 for 循环中打印所有内容的简单方法。有一个 non_upper_words 列表和一个 upper_words 列表。

    所以,程序的基本大纲是:

    1. 将字符串拆分为单词数组。
    2. 对于数组中的每个单词:如果 regex 返回 true,则添加到 upper_words。其他:添加到 non_upper_words。
    3. 在第一个数组中打印每个单词,然后在第二个数组中打印。

    我用伪代码写了这个,因为它是一个编程作业,所以你真的应该自己写实际的代码。希望对您有所帮助!

    【讨论】:

    • 比正则表达式更好:def haslower(s): return not s.lower()
    • 哎呀,意思是def hasupper(s): return not s.lower()
    【解决方案4】:

    您可以将isupper method 用于您的目的:

    text = 'sssample Text with And without'
    
    uppers = []
    lowers = []
    
    # Note that loop below could be modified to skip ,.-\/; and etc if neccessary
    for word in text.split():
        uppers.append(word) if word[0].isupper() else lowers.append(word)
    

    已编辑:您也可以通过以下方式使用islower method

    text = 'sssample Text with And without'
    
    other = []
    lowers = []
    
    # Note that loop below could be modified to skip ,.-\/; and etc if neccessary
    for word in text.split():
        lowers.append(word) if word.islower() else other.append(word)
    

    或者取决于你真正需要什么,你可以看看 istitle 方法:

    titled = []
    lowers = []
    
    for word in text.split():
        titled.append(word) if word.istitle() else lower.append(word)
    

    AND 与简单的 if else 语句:

    titled = []
    lowers = []
    
    for word in text.split():       
        if word.istitle():
            titled.append(word) 
        else:
            lower.append(word)
    

    【讨论】:

    • 像这样的三元表达式是 Guido 不愿意将它们添加到 Python 的原因。它们最好用于分配而不是产生副作用。此外,常规的 if-else 对新手来说会更清楚。
    • @Steven - 谢谢 - 我又添加了一个简单的 if...else 示例
    【解决方案5】:

    您可以使用 List Comprehensions 获取所有大写字符和小写字符。

    def get_all_cap_lowercase_list(inputStr): cap_temp_list = [c for c in inputStr if c.isupper()] low_temp_list = [c for c in inputStr if c.islower()] print("上限 {0} 列表和下限 {1} 列表".format(cap_temp_list,low_temp_list)) upper_case_count = len(cap_temp_list) lower_case_count = len(low_temp_list) print("上限 {0} 和下限 {1} 的计数".format(upper_case_count,lower_case_count)) get_all_cap_lowercase_list("嗨,这是演示 Python 程序")

    输出是:

    Cap 列表 ['H', 'T', 'P'] 和下列表 ['i', 'h', 'i', 's', 'i'、's'、'd'、'e'、'm'、'o'、'y'、't'、'h'、'o'、'n'、'p'、'r '、'o'、 'g', 'r', 'a', 'm']

    Cap 3 计数和 Lower 22 计数

    【讨论】:

      【解决方案6】:

      尝试执行以下操作:

      1. 字符串拆分为一个列表,其中每个项目都是一个单独的单词。
      2. 对于该列表中的每个单词,遍历并检查大写字母(考虑字符串常量,例如string.uppercase)。如果它有一个大写字母,请将其插入到结果列表的前面。如果没有,请将其追加到结果列表的末尾。
      3. 遍历您的结果,打印它们。或者,如果你想避免迭代,加入字符串中的项目使用换行符\n

      【讨论】:

        【解决方案7】:

        感谢大家的意见和帮助,这一切都非常有用。这是我最终提交的答案。

        s = input("Please enter a sentence: ")
        withcap = []
        without = []
        for word in s.split():
            if word.islower():
                without.append(word)
            else:
                withcap.append(word)
        
        onelist = withcap + without
        
        for word in onelist:
            print (word)
        

        【讨论】:

          【解决方案8】:

          我认为您的答案可能只是搜索首字母大写的单词。要查找单词中任何位置包含大写字母的单词,您必须枚举单词中的每个字母,如下所示:

          uin = input("Enter your text: ")
          
          ##create lists to hold upper and lower case words
          up_words = []
          no_up_words = []
          
          for i, word in enumerate(uin.strip().split()):
              if word.islower():
                  no_up_words.append(word)
              else: 
                  up_words.append(word)
          
          print(up_words, no_up_words)
          

          【讨论】:

            【解决方案9】:

            我的正则表达式:

            vendor  = "MyNameIsJoe. IWorkInDDFinc."
            ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor)
            

            我需要会发生的拆分词: My Name Is Joe. I Work In DDF inc.

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-18
              • 1970-01-01
              • 2022-01-22
              • 1970-01-01
              • 2016-02-15
              • 2014-11-28
              • 2019-08-08
              • 2011-01-20
              相关资源
              最近更新 更多