比如我现在有abc1,abc2,abc3..这样一直到abc100
我想有这样一个脚本可以直接python parse.py "abc[1-100]"
这样生成,,支持[a-z]这样,同时还支持{1,2,4}这样枚举的写法
之前的思路是利用split()
这样来过滤掉{}
或者[]
来进行解析
代码非常丑,而且效果不太好
后来有学长之前说可以用re.sub来做,还没尝试
不知道大家有没有更好玩的想法~~求指点
简单实现了一下 [] 的方式, {}的实现方法楼主可以参照这个实现 :)
需要 ply 模块
#!/usr/bin/python
# -*- coding: utf-8 -*-
__author__ = 'web'
import ply.lex as lex
import ply.yacc as yacc
# 词法分析
tokens = ('WORD', 'NUMBER')
# Regular expression rules for tokens
t_NUMBER = r'\d+'
t_ignore = ' \t'
def t_WORD(t):
r"""[a-z_]+"""
return t
def t_error(t):
print "Illegal character '%s'" % t.value[0]
t.lexer.skip(1)
literals = ['[', ']', '-']
lexer = lex.lex()
# 语法分析
def p_stmt_bracket(p):
"""stmt_bracket : WORD '[' stmt_bracket_inside ']'"""
p[0] = p[1]
for i in p[3]:
print(p[0]+i)
def p_stmt_bracket_inside(p):
"""stmt_bracket_inside : WORD '-' WORD
| NUMBER '-' NUMBER"""
if p[1].isdigit():
p[0] = [str(x) for x in range(int(p[1]), int(p[3]) + 1)]
if p[1].isalpha():
p[0] = [chr(i) for i in range(ord(p[1]), ord(p[3]) + 1)]
def p_error(p):
print 'parse error, unexpected token:', p.type
parser = yacc.yacc()
if __name__ == '__main__':
# 测试数据
data = 'abc[1-3]'
data2 = 'abc[a-d]'
parser.parse(data)
print('-------')
parser.parse(data2)
下面是结果 :)
abc1
abc2
abc3
--------
abca
abcb
abcc
abcd