首页 > python实现批量生成字符串思路

python实现批量生成字符串思路

比如我现在有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
【热门文章】
【热门文章】