0

次のような文字列の名前のリストを含むファイルがあります。

(ジョン|メアリー|ボブ)(アンダーソン|ブルックス|クック)

正規表現を使用して、次のような文字列でデータを取得しようとしています:

ジョン・アンダーソン ジョン・ブルックス ジョン・クック メアリー・アンダーソン メアリー・ブルックス メアリー・クック ボブ・アンダーソン ボブ・ブルックス ボブ・クック

私はRegExにかなり慣れていないので、助けがあれば感謝します。ありがとう

4

3 に答える 3

3

それは正規表現でできることではありません。正規表現エンジンはテキストを照合しますが、デカルト積を実行することはできません。もちろん、正規表現を使用して開始することもできます。見てみましょう-Pythonでは、私はそうします

>>> import itertools
>>> import re
>>> s  = "(John|Mary|Bob)(Anderson|Brooks|Cook)"
>>> names = [name.split("|") for name in re.findall(r"\(([^()]*)\)", s)]
>>> names
[['John', 'Mary', 'Bob'], ['Anderson', 'Brooks', 'Cook']]
>>> [" ".join(item) for item in itertools.product(*names)]
['John Anderson', 'John Brooks', 'John Cook', 'Mary Anderson', 'Mary Brooks', 
 'Mary Cook', 'Bob Anderson', 'Bob Brooks', 'Bob Cook']
于 2013-10-23T20:52:33.483 に答える
0

ソースファイルはすでに正規表現形式になっているように見えるため、問題は基本的にその正規表現に一致する文字列を生成することです。

いくつかの提案については、この質問を見てください: Python での正規表現の反転

于 2013-10-23T20:50:58.197 に答える
0

正規表現だけでは、これを完全に達成することはできません。一般に、正規表現エンジンは、入力内の特定の 1 つの場所 (最初に一致する可能性のある場所など) のみに一致するか、まったく一致しない可能性があります。そのため、すべての入力が消費されるか、パターンが no になるまで反復するループが必要です。より長い一致。

ループは、(while(true){} のように) 明示的にすることも、Tim の例のように暗黙的に行うこともできます。使用している言語やツールについては言及していないため、特定するのは困難です。正規表現のサポートはさまざまです。ティムの例では、ループは split() および findall() メソッドによって暗黙的に提供されます。Perl の split() も暗黙のループを提供します。

于 2013-10-23T21:09:42.567 に答える