Skip to main content
 首页 » 编程设计

python之随机数据生成器在 python 中对正则表达式进行数学运算

2024年11月01日31powertoolsteam

在 python 中,我正在寻找可用于创建匹配任何正则表达式的随机数据的 python 代码。例如,如果正则表达式是

\d{1,100} 

我想要一个随机数列表,随机长度在 1 到 100 之间(均匀分布)

有一些可用的“正则表达式反相器”(参见 here )可以计算所有可能的匹配项,这不是我想要的,而且非常不切实际。例如,上面的示例有超过 10^100 个可能的匹配项,这些匹配项永远无法存储在列表中。我只需要一个函数来随机返回匹配项。

也许已经有一个包可以用来完成这个?我需要一个为任何正则表达式创建匹配字符串的函数,不仅仅是给定的一个或其他一些,而且可能是 100 个不同的正则表达式。我只是无法自己编写代码,我希望函数提取模式以返回匹配的字符串。

请您参考如下方法:

如果您匹配的表达式没有任何“高级”功能,例如 look-ahead or look-behind , 然后你可以自己解析它并构建一个合适的生成器

将正则表达式的每个部分视为返回东西(例如,1 到 100 位之间)的函数,并将它们粘在顶部:

import random 
from string import digits, uppercase, letters 
 
def joiner(*items): 
    # actually should return lambda as the other functions 
    return ''.join(item() for item in items)   
 
def roll(item, n1, n2=None): 
    n2 = n2 or n1 
    return lambda: ''.join(item() for _ in xrange(random.randint(n1, n2))) 
 
def rand(collection): 
    return lambda: random.choice(collection) 
 
# this is a generator for /\d{1,10}:[A-Z]{5}/ 
print joiner(roll(rand(digits), 1, 10), 
             rand(':'), 
             roll(rand(uppercase), 5)) 
 
# [A-C]{2}\d{2,20}@\w{10,1000} 
print joiner(roll(rand('ABC'), 2), 
             roll(rand(digits), 2, 20), 
             rand('@'), 
             roll(rand(letters), 10, 1000)) 

解析正则表达式将是另一个问题。所以这个解决方案不是通用的,但也许就足够了