【问题标题】:I need to choose strings beginning with capital letters and possibly ending with lower case我需要选择以大写字母开头并可能以小写字母结尾的字符串
【发布时间】:2021-02-25 22:37:00
【问题描述】:

我需要从集合中以大写开头并以小写结尾的文本正文中选择字符串。这可以包括一个字母大写的单词,并排除所有字母大写的较长字符串,例如从这个:“A”,“AbA”,“Ab”,“b”,“bA”,“bbb”,“AAA”我需要选择这个:“A”,“Ab”。这不起作用:

from nltk.books import *
up_low = {
    x 
    for x in text1
    if x[0].isupper() and x[1:].islower
    
}

任何提示将不胜感激,我刚开始使用 python :)

【问题讨论】:

  • 你需要正确缩进你的代码
  • 它们在 Python 中用于定义字典
  • 大括号用于定义字典,但不能在大括号内创建一个函数。
  • @Mr.J “内部有函数”是什么意思?你为什么说字典?这是一个集合理解。
  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。

标签: python uppercase lowercase


【解决方案1】:

您可以使用text[-1] 访问字符串的最后一个字符。 据我了解你想要:

  • 开头的大写字母。总是:text[0].isupper()
  • 要么,就是这样(结果A):len(text) == 1
  • 或以小写字母结尾:text[-1].islower()

最终代码:

texts = ["A", "AbA", "Ab", "b", "bA", "bbb", "AAA"]
for text in texts:
    if text[0].isupper() and (len(text) == 1 or text[-1].islower()):
        print(text)

或者,如果您希望结果是一个列表:

texts = ["A", "AbA", "Ab", "b", "bA", "bbb", "AAA"]
result = [text for text in texts if text[0].isupper() and (len(text) == 1 or text[-1].islower())]
print(result)

【讨论】:

    【解决方案2】:

    你可以使用正则表达式。我把它放在这里是为了补充 Thomas Weller 的答案。

    为了使用它们,您需要导入正则表达式库:

    import re
    

    我制作了一个字典,使用数字作为键,文本作为值。

    string_dict = {}
    string_dict[0] = "A"
    string_dict[1] = "AbA"
    string_dict[2] = "Ab"
    string_dict[3] = "b"
    string_dict[4] = "bA"
    string_dict[5] = "bbb"
    string_dict[6] = "AAA"
    

    如果您只想知道文本是否通过条件,那么这可以工作:

    regexp = "^[A-Z][a-z]*$"
    for key, text in string_dict.items():
        if re.search(regexp, text):
            print("Passed: " + text)
    

    这将输出:

    Passed: A
    Passed: Ab
    

    如果您想将结果存储在列表中:

    regexp = "^[A-Z][a-z]*$"
    results = []
    for key, text in string_dict.items():
        if re.search(regexp, text):
            results.append(text)
    
    print(results)
    

    这将输出:

    ['A', 'Ab']
    

    【讨论】:

      【解决方案3】:

      你可以使用正则表达式:

      import re
      
      text     = ["A", "AbA", "Ab", "b", "bA", "bbb", "AAA","ABa"]
      selected = [t for t in text if re.match(r"^[A-Z](.*[a-z])?$",t)]
      
      print(selected)
      ['A', 'Ab','ABa']  
      

      注意:我添加了符合您描述的标准的“ABa”,但样本数据中缺少一个用例(“A3-5b”也是如此)。

      【讨论】:

      • 嗯,正如我在问题下评论的那样,我发现他们的文字不清楚,他们的x[1:].islower 看起来他们想要'ABa'...跨度>
      • 然后它也再次声明“这不起作用”(没有说明原因)
      • 对,虽然我会说缺少()(即调用 islower),这是一个更可能的原因(这显然是无意的,而[1:] 在我看来是故意的)。哦,好吧,也许OP最终会澄清。
      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多