问题描述
我需要从集合中的文本正文中挑选字符串,以大写开头并以小写结尾。这可以包括一个字母大写的单词并排除所有字母大写的较长字符串,例如从这个:“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]