2013-07-31 3 views
1

В python я ищу код python, который я могу использовать для создания случайных данных, соответствующих любому регулярному выражению. Например, если регулярное выражениеГенератор случайных данных mathing regex в python

\d{1,100} 

Я хочу иметь список случайных чисел со случайной длиной от 1 до 100 (равномерно распределенных)

Есть некоторые «регулярные выражения инверторов» доступны (см here), которые вычисляют ВСЕ возможные совпадения, чего я не хочу, и которые крайне невыполнимы. Например, пример выше имеет более 10^100 возможных совпадений, которые никогда не могут быть сохранены в списке. Мне просто нужна функция, чтобы возвращать совпадение случайным образом.

Возможно, имеется пакет, который можно использовать для этого? Мне нужна функция, которая создает соответствующую строку для ANY regex, а не только одного или другого, но может быть 100 различных регулярных выражений. Я просто не могу закодировать их сам, я хочу, чтобы функция извлекла шаблон, чтобы вернуть мне соответствующую строку.

+0

Является ли '\ d {1,100}' реальным примером? Не могли бы вы вставить некоторые из них, с которыми вы работаете в реальности? Если регулярное выражение не слишком * нечеткое, вы можете создать случайную строку, близкую к соответствующему выражению, и отбросить ее, если она не совпадает. –

+1

Приведенный пример - пример 'a'. Я еще не знаю, что мне нужно. Это может быть намного сложнее, чем '[A-C] {2} \ d {2,20} @ \ w {10,1000}'. – Alex

+1

Какое распределение вы хотите по возможным строкам? Например, для вашего примера, хотите ли вы, чтобы большинство случайных результатов составляли 100 цифр (поскольку 90% действительных строк соответствия будут иметь много)? Или вы хотите, чтобы каждая длина происходила с одинаковой вероятностью? – Blckknght

ответ

0

Из этого answer

Вы можете попробовать использовать питон назвать этот PERL модуль:

https://metacpan.org/module/String::Random

+0

Я бы предпочел только решение python, так как для решения perl требуется (i) исправить проблему с импортом String/Random (ii) для передачи параметров функции perl (iii) для возврата вывода и (iv) возможно, другие вопросы, касающиеся запуска этого фрагмента кода на разных машинах, Linux и Windows. – Alex

1

Если выражения вы подходите не имеют какую-либо «продвинутые» функции, как 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)) 

Синтаксический регулярное выражение будет другой вопрос. Таким образом, это решение не является универсальным, но, возможно, его достаточно

+0

Это очень близко к тому, что я собирался сказать в своем собственном ответе.Да, это можно сделать, но просто анализировать шаблон регулярного выражения достаточно сложно, я не думаю, что какой-либо случайный SO-ответчик будет генерировать рабочий код. – Blckknght

+0

@Blckknght: разбор регулярного выражения будет трудным, но, безусловно, выполнимым, вы можете использовать регулярное выражение для этого: –

Смежные вопросы