我需要选择以大写字母开头并可能以小写字母结尾的字符串

问题描述

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

def main():
    import sys
    with open(sys.argv[1],'r') as f:
        graph,from_where,to_where = read_graph(f)
    path = search_path(graph,to_where)
    print(path)
if __name__ == '__main__':
main()

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

解决方法

您可以使用 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","AAA"]
result = [text for text in texts if text[0].isupper() and (len(text) == 1 or text[-1].islower())]
print(result)
,

您可以使用正则表达式。我把它放在这里是为了补充 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):
        results.append(text)

print(results)

这将输出:

['A','Ab']
,

您可以使用正则表达式:

import re

text     = ["A","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”也是如此)。

,

从您的代码可以明显看出,您想用生成器初始化 dict。但是,您应该使用方括号将其初始化为 list。正如您在查询中指出的,文本是 dict

up_low=[x for x in text.values() if x[0].isupper() and x[1:].islower]