2016-03-27 9 views
0

のような声明:regexはステートメントとオプションの終わり部分をどのようにマッチさせますか?

[string1...] string2 in english/chinese (string3...) 

はstring3が()であり、省略可能です。

私はPythonで正規表現パターンの書き込み:

(\[(?P<string1>.*)\])\s*(?P<string2>.*)\s(\((?P<string3>.*)\))? 

をしかし*として貪欲な試合とはstring3はstring2の中に解析されますです。

は私のような先読みマッチはstring3を使用します。

(\[(?P<string1>.*)\])\s*(?P<string2>.*(?=\())\s*((?P<string3>.*)\))? 

しかし、また一致ではありません。

どのように3つのマッチ部分を取得する必要があり、最後の部分は()内でオプションですか?

+0

、すべてこのパターンです。 –

+0

問題のように、入力には最後に '?'という文字列がありますか? – anubhava

+1

@anubhava申し訳ありませんが、最後の '? 'はstring3が省略可能であることを示しています。プレーンテキストで削除します –

答えて

2

あなたはアンカー$と否定パターンに基づいて、この正規表現を使用することができます。

\[(?P<string1>[^\]]*)\]\s*(?P<string2>[^()]*)(?:\s+\((?P<string3>.*)\))?$ 

ここでは、2否定サブパターンを使用している。このような

[^\]]* # matches 0 or more of any char that 
[^()]* # matches 0 or more of any char that is not (and) 

RegEx Demo

+1

なぜここにダウンボートがありますか? – Jan

+0

私はなぜポストの秒以内にdownvoteが現れたのか分かりません。トリガー幸せなdownvoterのように見える答えを読む気にしませんでした。 – anubhava

+1

私からいくつかの報酬(幸せupvoter、それは;-) – Jan

2

何かを?

^(?P<string1>\[[^]]+\])  # anchor it to the start 
(?P<string2>[^(\n]+)   # everything not a (
(?:\((?P<string3>[^)]+)\))?$ # sth. in(), optional 

multilineverboseモードでは、a demo on regex101.comを参照してください。
Pythonで :あなたの正規表現で

import re 
string = "[string1...] string2 in english/chinese (string3...)" 
rx = re.compile(""" 
    ^(?P<string1>\[[^]]+\])  # anchor it to the start 
    (?P<string2>[^(\n]+)   # everything not a (
    (?:\((?P<string3>[^)]+)\))?$ # sth. in(), optional 
""", re.MULTILINE|re.VERBOSE) 
matches = rx.findall(string) 
+0

こんにちは、string2では、なぜ改行のために' \ n 'を除外しますか? –

+0

@ TankyWoo:デモ(regex101)のため、実際の例では必要ありません。 – Jan

2

私は、文字列3が括弧で囲まれていることを意味し、ちょうどstring 3\(を参照してください。この場合、string 2と一致することができます。左括弧はこのように見つかりません。

正規表現:なし可能な入力@anubhava(\[(?P<string1>.*?)\])\s*(?P<string2>[^\(]*)\s*(\((?P<string3>.*)\))?

注グループ内[^\(]string2

Regex101 Demo

関連する問題