从正则表达式字符集生成随机字符串

时间:2013-07-08 19:31:43

标签: python regex string

我认为有一些漂亮的Pythonic方法可以做到这一点,但我还没有想到它。基本上我正在寻找创建一个测试模块,并希望一个简单的方法让用户定义一个字符集来拉取。我可以连接一个与字符串相关的各种字符集的列表,但这让我觉得它是一个非常不干净的解决方案。有没有办法得到正则表达式代表的字符集?

示例:

def foo(regex_set):
    re.something(re.compile(regex_set))

foo("[a-z]")
>>> abcdefghijklmnopqrstuvwxyz

编译当然是可选的,但在我看来,这就是这个函数的样子。

4 个答案:

答案 0 :(得分:9)

Pyparsing的作者Paul McGuire撰写了一篇inverse regex parser,你可以用它来做这件事:

import invRegex
print(''.join(invRegex.invert('[a-z]')))
# abcdefghijklmnopqrstuvwxyz

如果您不想安装Pyparsing,还可以使用a regex inverter that uses only modules from the standard library来编写:

import inverse_regex
print(''.join(inverse_regex.ipermute('[a-z]')))
# abcdefghijklmnopqrstuvwxyz

注意:两个模块都不能反转所有正则表达式模式。


两个模块之间存在差异:

import invRegex
import inverse_regex
print(repr(''.join(invRegex.invert('.'))))
print(repr(''.join(inverse_regex.ipermute('.'))))

产量

'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

这是另一个区别,这次pyparsing列举了一组更大的匹配:

x = list(invRegex.invert('[a-z][0-9]?.'))
y = list(inverse_regex.ipermute('[a-z][0-9]?.'))
print(len(x))
# 26884
print(len(y))
# 1100

答案 1 :(得分:2)

这里不需要正则表达式。如果您想让用户选择一个字符集,让他们只选择字符。正如我在评论中所说的那样,只需列出所有字符并按其添加复选框就足够了。如果你想要更紧凑的东西,或者看起来更酷,你可以做其中一件事:

One way of displaying the letter selection. (green = selected) Another way of displaying the letter selection. (no x = selected Yet another way of displaying the letter selection. (black bg = selected)

当然,如果你真的使用它,你提出的东西无疑会比这些看起来更好(而且它们实际上也会包含所有字母,而不仅仅是“A”)。

如果需要,您可以添加一个按钮来反转选择,选择全部,清除选择,保存选择或其他任何您需要做的事情。

答案 2 :(得分:1)

如果只是简单的范围你可以手动解析它

def range_parse(rng):
    min,max = rng.split("-")
    return "".join(chr(i) for i in range(ord(min),ord(max)+1))

print range_parse("a-z")+range_parse('A-Z')

但其严重......

答案 3 :(得分:0)

我想到的另一个简化问题的解决方案:

作为提示的一部分,将您自己的[]粘贴在该行上,并禁止输入中的这些字符。扫描输入并验证它不包含与[\[\]]匹配的任何内容后,您可以添加[并将]附加到字符串,并将其用作正则字符串对齐所有字符串需要的字符("abcdefghijklmnopqrstuvwxyz",堡垒实例)。