2

ここの正規表現の初心者、私はどんな助けにも感謝します。

cstring = "[0,90,(+45,45)3,0/]S"
regex = re.compile(r'^(\[)(\S+)(\/?)(\][ST]$)')
match = regex.search(cstring)
for s in match.groups():
    print s

結果は"[""0,90、(+ 45,45)3,0 /" "] S"ですが、別の(オプションで-上記から1つだけ)グループで"/"を取得したいと思います。\ Sを[0-9()、+-]-(2番目のグループで期待される唯一の文字)のような任意の組み合わせに置き換えようとしましたが、役に立ちませんでした。

4

2 に答える 2

4

正規表現の数量指定子+および*は貪欲です。?を追加できます。それらの最後(+?および*?)に追加して、それらを貪欲でない形式に変換します。

貪欲とは、オペレーターが次のトークンをチェックする前に、可能な限りすべてを消費しようとすることを意味します。

だから

\S+\/?

Sは、/がチェックされる前に可能な限りすべてを消費しようとします。/はオプションであるため、何もする必要はありません。

欲張りでない形にしたら

\S+?\/?

Sは、/を試行する前に可能な限り消費を少なくします。つまり、/は任意のトークンで「最初のディブ」を取得します。取得に失敗すると、これらのトークンは\ S +に対して試行されますか?

私は以下を使用して成功を見つけました:

regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)')

詳細については、pythonredocsでgreedyを検索してください。

補足として、re.VERBOSEフラグをre.compileに渡すと、文字列内の空白が無視されます。つまり、次のように構造化できます。

regex = re.compile(r'^ (\[) (\S+?) (\/?) (\][ST]$) ', re.VERBOSE)

これは、正規表現を学ぶときに非常に役立ちました。

また、グループ外の文字列トークンの始まり'^(['が、グループ内の文字列トークンの終わり'(] [ST] $)'があります。これは、読みやすさを除いて違いはありません。

于 2012-06-03T03:18:39.933 に答える
0

キャラクターに貪欲でないマッチングを使用してみてください\S。そのグループはあなたの/キャラクターを飲み込んでいます。

正規表現をこれに変更すると、次のように機能します。

cstring = "[0,90,(+45,45)3,0/]S"
regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)')
match = regex.search(cstring)
for s in match.groups():
    print s
于 2012-06-03T03:18:50.890 に答える