我在编码过程中遇到的一个小问题。
我打算打印出.txt文件的名称。 例如,该文件名为:verdata_florida.txt或verdata_newyork.txt 如何排除.txt和verdata_,但保持字符串?它必须适用于任意数量的字符,但必须排除.txt和verdata_。
这是我到目前为止的地方,我已经定义了要输入的文件名()
print("Average TAM at", str(filename[8:**????**]), "is higher than ")
答案 0 :(得分:2)
3种方式:
两次使用str.split
:
>>> "verdata_florida.txt".split("_")[1].split(".")[0]
'florida'
两次使用str.partition
(如果格式不匹配,也不会出现异常,也可能更快):
>>> "verdata_florida.txt".partition("_")[2].partition(".")[0]
'florida'
使用re
,只保留中间部分:
>>> import re
>>> re.sub(".*_(.*)\..*",r"\1","verdata_florida.txt")
'florida'
如果_
和.
多次出现(必须保留最长或最短的字符串),则必须调整上述所有内容。
编辑:在你的情况下,前缀&后缀似乎是固定的。在这种情况下,只需使用str.replace
两次:
>>> "verdata_florida.txt".replace("verdata_","").replace(".txt","")
'florida'
答案 1 :(得分:2)
假设您希望它在第一个_
和最后一个.
上拆分,您可以使用切片以及index
和rindex
函数来完成此操作。这些函数将在括号中搜索第一次出现的子字符串并返回索引号。如果没有找到子字符串,它们将抛出ValueError
。如果需要搜索,但不是ValueError
,则您还可以使用find
和rfind
,它们执行相同的操作,但如果找不到匹配项,则始终返回-1
。
s = 'verdata_new_hampshire.txt'
s_trunc = s[s.index('_') + 1: s.rindex('.')] # or s[s.find('_') + 1: s.rfind('.')]
print(s_trunc) # new_hampshire
当然,如果您总是要排除verdata_
和.txt
,您也可以随时对切片进行硬编码。
print(s[8:-4]) # new_hampshire
答案 2 :(得分:1)
您可以按字母和下划线分割:
string filename = "verdata_prague.txt";
string name = filename.split("."); //verdata_prague
name = name[0].split("_")[1]; //prague
或通过替换功能:
string filename = "verdata_prague.txt";
string name = filename.replace(".txt",""); //verdata_prague
name = name[0].replace("verdata_","")[1]; //prague
答案 3 :(得分:1)
您可以在字符串上使用str.split()
。例如:
s = 'verdata_newyork.txt'
s.split('verdata_')
# ['', 'florida.txt']
s.split('verdata_')[1]
# 'florida.txt'
s.split('verdata_')[1].split('.txt')
['florida', '']
s.split('verdata_')[1].split('.txt')[0]
# 'florida'