3

Python では、任意の正規表現に一致するランダム データを作成するために使用できる Python コードを探しています。たとえば、正規表現が

\d{1,100}

1 から 100 までのランダムな長さの乱数のリストが必要です (均等に分散されます)。

可能なすべての一致を計算する「正規表現インバーター」が利用可能です (こちらを参照)。これは私が望むものではなく、非常に実用的ではありません。たとえば、上記の例では、10^100 を超える可能性のある一致があり、リストに格納することはできません。ランダムに一致を返す関数が必要です。

これを実現するために使用できるパッケージが既に利用可能である可能性がありますか? 指定された正規表現だけでなく、おそらく100の異なる正規表現に一致する文字列を作成する関数が必要です。私はそれらを自分でコーディングすることはできません。関数がパターンを抽出して、一致する文字列を返すようにしたいのです。

4

3 に答える 3

1

sre-yield と Hypothesis の 2 つの Python ライブラリでこれを行うことができます。

  1. 再収量

sre-yeld は、指定された正規表現に一致するすべての値を生成します。Python のデフォルトの正規表現エンジンである SRE を使用します。

例えば、

import sre_yield
list(sre_yield.AllStrings('[a-z]oo$'))
['aoo', 'boo', 'coo', 'doo', 'eoo', 'foo', 'goo', 'hoo', 'ioo', 'joo', 'koo', 'loo', 'moo', 'noo', 'ooo', 'poo', 'qoo', 'roo', 'soo', 'too', 'uoo', 'voo', 'woo', 'xoo', 'yoo', 'zoo']

10 進数の場合、

list(sre_yield.AllStrings('\d{1,2}'))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99']
  1. 仮説

単体テスト ライブラリ Hypothesis は、ランダムに一致する例を生成します。また、SRE を使用して構築されています。

import hypothesis
g=hypothesis.strategies.from_regex(r'^[A-Z][a-z]$')
g.example()

次のような出力で:

'Gssov', 'Lmsud', 'Ixnoy'

10 進数の場合

d=hypothesis.strategies.from_regex(r'^[0-9]{1,2}$')

均等に分散されていませんが、1 桁または 2 桁の 10 進数を出力します: 65、7、67。\d を使用すると、印刷できない文字列が生成されました。

注: 不要な文字を避けるために、開始アンカーと終了アンカーを使用してください。

于 2019-09-11T16:37:31.637 に答える
0

この回答から

Python を使用して、この perl モジュールを呼び出すことができます。

https://metacpan.org/module/String::ランダム

于 2013-07-31T05:49:26.663 に答える