0

私はこのようなことをすることに行き詰まっています..

これから

{Hi|Hello} I am - {Me|You|Us}

これに

#Possible results
'Hi I am - You'
'Hello I am - Me'
'Hi I am - Us'
'Hello I am - You'

基本的に、コードは中括弧 {} で囲まれた単語を検索します。これらの中括弧には、分割される複数の単語が含まれています。全体として、すべての中括弧は単語のみを出力し、ランダムに選択します。

これには正規表現が必要ですか? 事前に作成されたライブラリを検索してみましたが、古いライブラリを見つけました..誰か助けてもらえますか?

4

2 に答える 2

1

入力が比較的単純な場合 (質問に示されているように、複数の可能性のあるテキスト フラグメントを提供する目的でのみ{とが出現する場合)、次のような正規表現を使用できます。}

import re

p = re.compile('(\{[^\}]+\}|[^\{\}]*)')

次に、テキストを次のようにフラグメントに分割します。

frags = p.split("{Foo|Bar} baz {quux|wibble}.")
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', '']

このリストの文字列ごとに、可能な値のリストを生成できます ( で始まらない文字列に対して 1 つだけ{)。

def options(s):
    if len(s) > 0 and s[0] == '{':
        return [opt for opt in s[1:-1].split('|')]
    return [s]

options("foo")
# ["foo"]

options("{foo|bar}")
# ["foo", "bar"]

次に、オプションのリストのリストを作成します。

opt_lists = [options(frag) for frag in frags]

次に、デカルト積を作成して結合します。

import itertools

for spec in itertools.product(*opt_lists):
    print(''.join(spec))

"{Foo|Bar} baz {quux|wibble}."この例の出力は次のとおりです。

Foo baz quux.
Foo baz wibble.
Bar baz quux.
Bar baz wibble.

入力がさらに複雑な場合は、実際の入力形式に対してより複雑な正規表現またはパーサーを使用する必要があるかもしれませんが、オプションのリストのリストを中間結果として生成するという一般的な考え方は有効です。

于 2013-07-14T00:09:53.360 に答える
0

これを試してください:

Tintadgel:~ dhoelzer$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile('(Hi|Hello) I am - (Me|You|Us)')
>>> print p.match("Hi I am - You")
<_sre.SRE_Match object at 0x106481470>
>>> p.match("Hi I am - Yo")
>>> 

これが何が起こっているかです。正規表現ライブラリをインポートすることから始めます。次に、「こんにちは」または「こんにちは」で始まり、次のいずれかで終わる文字列を探す正規表現をコンパイルします。

それが作成されたので、それに対して直接マッチを実行できるようになりました。print p.match("Hi I am - You")オブジェクトを返すことに注意してください。これは、私たちが試合をしたことを意味します!逆に、p.match("Hi I am - Yo")一致が見つからなかったことを示す、何も返しません。

お役に立てれば!http://docs.python.org/2/howto/regex.htmlをのぞいてみてください。

于 2013-07-13T22:55:35.553 に答える