5

これを行うための美しいPythonicの方法があると思いますが、まだよくわかりません. 基本的に、私はテスト モジュールを作成することを検討しており、ユーザーがプルする文字セットを定義する簡単な方法を望んでいます。文字列に関連付けられたさまざまな文字セットのリストを連結できる可能性がありますが、それは非常に不潔な解決策だと思います。正規表現が表す文字セットを取得する方法はありますか?

例:

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

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

コンパイルはもちろんオプションですが、私の考えでは、この関数は次のようになります。

4

4 に答える 4

9

Pyparsingの著者である Paul McGuire は、これを行うことができる逆正規表現パーサーを作成しました。

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

Pyparsing をインストールしたくない場合は、次のように記述できる標準ライブラリのモジュールのみを使用する正規表現インバーターもあります。

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

注: どちらのモジュールも、すべての正規表現パターンを反転することはできません。


また、2 つのモジュールには違いがあります。

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

于 2013-07-08T19:45:44.977 に答える
2

ここでは正規表現は必要ありません。ユーザーに文字セットを選択させたい場合は、文字を選択させます。コメントで述べたように、すべての文字をリストしてチェックボックスを配置するだけで十分です。よりコンパクトな、またはよりクールに見えるものが必要な場合は、次のいずれかを実行できます。

文字選択を表示する 1 つの方法。 (緑 = 選択済み) 文字選択を表示する別の方法。 (x なし = 選択済み 文字選択を表示するさらに別の方法。 (黒の背景 = 選択)

もちろん、実際にこれを使用すると、思いつくものは間違いなくこれらよりも見栄えがよくなります (また、実際には「A」だけでなく、すべての文字が含まれています)。

必要に応じて、選択を反転する、すべてを選択する、選択をクリアする、選択を保存するなど、必要な操作を行うためのボタンを含めることができます。

于 2013-07-08T20:15:25.307 に答える
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')

しかし、そのグロス...

于 2013-07-08T19:39:46.790 に答える
0

問題を単純化するために私が考えた別の解決策:

プロンプトの一部として独自の[andを行に貼り付け、入力でそれらの文字を許可しないでください。]入力をスキャンして、一致するものが含まれていないことを確認し[\[\]]たら、文字列の前[に追加]して追加し、必要なすべての文字の文字列に対して正規表現のように使用できます ( "abcdefghijklmnopqrstuvwxyz"、 fort インスタンス)。

于 2013-07-11T11:34:08.137 に答える