我正在尝试分析大约30000个文件名中的数据。以下是几个例子:
A0038clone11-BA28.ab1
A038clone11-BA31.ab1
A0038clone11-BA32.ab1
A0001-R00-tatI-BA29.ab1
A0001-R00-V3-BA31.ab1
A0001-R00-LTR-BA43.ab1
A0001-R00-BA81-tat1.ab1
A0002_R07-Primer7.ab1
A0016_A0053_R01-Primer5.ab1
A0016:A0053-R02-Primer7.ab1
A0017_A0054_R04-Primer5.ab1
A0017_A0054_R07-Primer5.ab1
A0037_R06_042712-Primer7_R.ab1
A0037_R07-Primer5_R.ab1
A0041-R01-12Feb-BA87-tat2.ab1
A0094-R00-BA88-fall to early.ab1
A0094-R02-BA88-need to repeat.ab1
A0107-R01-WZ5-BA86-tat1.ab1
A0111_R04_P5_GC-Primer5.ab1
A0179-R02LTR-BA83_R-bad seq.ab1
我试图提取以下信息:
我刚开始使用pyparsing
,所以我需要一些帮助。你知道吗
我的第一个猜测是:
pat = pyp.Combine(pyp.Word('A') + pyp.Word(pyp.nums))
visit = pyp.Combine(pyp.Word('R') + pyp.Word(pyp.nums))
clone = pyp.Combine('clone' + pyp.Word(pyp.nums))
primer = pyp.Combine(pyp.oneOf('Primer BA', caseless=True) + pyp.Word(pyp.nums))
extension = pyp.Combine(pyp.Optional(pyp.CaselessLiteral('_R'))+pyp.CaselessLiteral('.ab1'))
parser = pat + pyp.Optional(visit, default='R00') + pyp.Optional(clone, default='clone01') + primer + extension
parser.setDefaultWhitespaceChars(' -/:_-')
但是当顺序关闭或者有多余的单词在里面(比如tatI
,V3
,等等)时,这就失败了。你知道吗
使用来自Pyparsing - where order of tokens in unpredictable的建议,我尝试使用OneOrMore
操作符,比如:
parser = pyp.OneOrMore(pyp.MatchFirst([pat,
visit,
clone,
primer,
extension]))
parser.setDefaultWhitespaceChars(' -/:_-')
但在某些情况下,它忽略了primer
:比如A0001-R00-LTR-BA43.ab1
,但不是A0001-R00-BA81-tat1.ab1
,原因我不明白。你知道吗
如有任何建议,将不胜感激!你知道吗
你差点就到了。您需要匹配额外的令牌(我假设您不关心)。只需确保额外的比赛是在最后,所以不要狼吞虎咽你感兴趣的东西。使用
names
作为帖子中定义的列表:通过给中间结果起一个名字,例如
clone("clone")
,我们可以为它们创建一个字典以便于访问:导致
相关问题 更多 >
编程相关推荐