我有一个包含文件名的字符串列表,
file_names = ['filei.txt','filej.txt','filek.txt','file2i.txt','file2j.txt','file2k.txt','file3i.txt','file3j.txt','file3k.txt']然后,我使用以下命令删除.txt扩展:
extension = os.path.commonprefix([n[::-1] for n in file_names])[::-1]
file_names_strip = [n[:-len(extension)] for n in file_names],然后返回列表file_names_strip中每个字符串的最后一个字符
h = [n[-1:] for n in file_names_strip]这给了h = ['i', 'j', 'k', 'i', 'j', 'k', 'i', 'j', 'k']
如何在h中测试字符串模式?因此,如果i、j、k顺序出现,则返回True,否则返回False。我需要知道这一点,因为并不是所有的文件名都像在file_names中那样格式化。
所以:
test_ijk_pattern(h) = True
no_pattern = ['1','2','3','1','2','3','1','2','3']
test_ijk_pattern(no_pattern) = False发布于 2013-11-08 22:16:17
以下是我将如何解决这个问题:
def patternFinder(h): #Takes a list and returns a list of the pattern if found, otherwise returns an empty list
if h[0] in h[1:]:
rptIndex = h[1:].index(h[0]) + 1 #Gets the index of the second instance of the first element in the list
else:
print "This list has no pattern"
return []
if len(h) % rptIndex != 0:
h = h[:-(len(h) % rptIndex)] #Takes off extra entries at the end which would break the next step
subLists = [h[i:i+rptIndex] for i in range(0,len(h),rptIndex)] #Divide h into sublists which should all have the same pattern
hasPattern = True #Assume the list has a pattern
numReps = 0 #Number of times the pattern appears
for subList in subLists:
if subList != subLists[0]:
hasPattern = False
else:
numReps += 1
if hasPattern and numReps != 1:
pattern = subList[0]
return pattern
else:
print "This list has no pattern"
return []这样做的假设:
模式显示在前几个字符中,末尾的不完整模式并不重要([1,2,3,1,2,3,1,2]会想出两个[1,2,3])
h实例至少有两个entries
[1,2,3,1,2,3,1,2]如果你对这些假设没有意见,那么这将对你有用,希望这对你有所帮助!
发布于 2013-11-08 22:02:20
您可以使用正则表达式。
import re
def test_pattern(pattern, mylist):
print pattern
print mylist
print "".join(mylist)
if re.match(r'(%s)+$' % pattern, "".join(mylist)) != None: # if the pattern matchtes at least one time, nothing else is allowed
return True
return False
print test_pattern("ijk", ["i", "j", "k", "i", "j", "k"])您可以这样做,而不会去掉最后一个字母和文件结尾。我更新了正则表达式,这样它就可以工作了。一个问题是,我使用了变量名,它查找模式"mypattern“。使用%s将其替换为真实模式。我希望这个解决方案适合你。
myfiles = ["ai.txt", "aj.txt", "ak.txt", "bi.txt", "bj.txt", "bk.txt"]
mypattern = ["i", "j", "k"]
import re
# pattern as a list e.g. ["i", "j", "k"]
def test_pattern(pattern, filenames):
mypattern = "["+"\.[a-zA-Z0-9]*".join(pattern) + "\.[a-zA-Z0-9]*]*"
# this pattern matches any character, an "i", followed by a dot, any characters, followed by j., any characters, followd by k. (change it a bit if your file names contain numbers and/or uppercase)
print mypattern
print "".join(filenames)
if re.search(r'%s' % mypattern, "".join(filenames)) != None: # if the pattern matchtes at least one time, nothing else is allowed
return True
return False
print test_pattern(mypattern, myfiles)输出:
[i\.[a-zA-Z0-9]*j\.[a-zA-Z0-9]*k\.[a-zA-Z0-9]*]*
ai.txtaj.txtak.txtbi.txtbj.txtbk.txt
Truehttps://stackoverflow.com/questions/19860558
复制相似问题