1

「タグ」が仕様に従って適切に再フォーマットされることを保証する正規表現を作成しようとしています。(私はたくさんのレガシーなものを更新しています。)

()一般的な考え方として、タグは または のいずれかに括弧で囲まれたコンテンツを含めることができます[]。ただし、既存のタグの形式が正しくない可能性があります。

  • 良い :
    • Sample (sample)
    • Sample [sample]
  • 悪い :
    • Sample (( sample )
    • Sample [(sample]]

現在、これを一連の正規表現で処理していますが、技術的に単一の正規表現で行うことができるかどうか疑問に思っています。

コードの簡略化されたバージョンでは...

RE_tag_collapse = re.compile(\
    """
        ([\[\(])+               ### opening bracket
            \s*
            (                   # the contents
                [^\]\)]+
            )
            \s*
        ([\]\)])*               # closing bracket
    """
    ,
    re.I | re.VERBOSE
)
edited= re.sub( RE_tag_collapse , r'\1\2\1' , tag )

この正規表現の問題は、終了タグ (2 番目の\1) が開始タグと同じであることです。

私がやりたいことは、開始タグの逆になるように終了タグをマップすることです:

  • (に反転します)
  • [に反転します]

これが簡単に実現できるかどうかは誰にもわかりませんか?私の最善の解決策は、そのままにして複数の正規表現を使用することです。

4

2 に答える 2

2

すべての開き括弧と閉じ括弧をグループとしてキャプチャするように正規表現を変更すると、開き括弧セットから正しい閉じ括弧セットを生成し、それを正規表現置換で使用できます

このような:

>>> def subber(matchobj):
    return ' '.join([matchobj.group(1),
             matchobj.group(2),
             matchobj.group(1).replace('[',']').replace('(', ')')[::-1]])

>>> new_RE = re.compile(\
    """
        ([\[\(]+)               ### opening brackets
            \s*
            (                   # the contents
                [^\]\)]+
            )
            \s*
        ([\]\)]+)               # closing brackets
    """
    ,
    re.I | re.VERBOSE
)
>>> txt = 'Sample [(sample]]'
>>> new_RE.sub(subber, txt)
'Sample [( sample )]'
>>> 

閉じ括弧は、開き括弧をキャプチャしてから逆にするグループ内の閉じ括弧をすべての開き括弧に置き換えているだけです。

于 2012-09-01T10:01:09.333 に答える
2

あなたの質問を正しく理解できたら、タグの括弧が一致していることを確認してください。私の知る限り、Python の正規表現には出現回数をカウントする方法がありません。ただし、関数を使用して、次のように括弧が一致するかどうかを確認できます。

def check_tag(tag):
    charstack = []
    for c in tag:
        if c in ["(","]"]:
            charstack.append(c)
        else if c in [")","]"]:
            popped = charstack.pop()
            if not ((c == ")" and popped == "(" ) or (c == "]" and popped == "[")):
                return False
    return len(charstack) == 0

この関数が機能する方法は、開始括弧が見つかるたびに、それをスタックにプッシュすることです。閉じ括弧に遭遇するたびに、要素をスタックからプッシュして、それらが一致するかどうかを確認します。そうでない場合は、タグの形式が正しくありません。

于 2012-08-31T22:30:39.740 に答える