1

次のような文字列があるとします。

first_string = "(white cats || 'dogs) && ($1,000 || $500-$900' || 1,000+)"

そして、次のようにして、各単語を「replace」というテキストに置き換えます。

new_string = re.sub(r'[\w$\-+,][\w$\-+,\t ]*[\w$\-+,]|[\w$\-+,],', "replace", first_string, flags=re.IGNORECASE)

そして私は出ます:

new_string = "(replace || replace) && (replace || replace || replace)"

これはうまくいきます。しかし、new_string が特定の形式であることを検証したいと思います。

たとえば、正規表現を使用して new_string が上記の一般的な形式に適合することを確認する方法はありますか?

  • で区切られた括弧のセットが常にあります。&&
  • 各親セットには、で区切られた文字列が含まれています||
  • 各親セット内の文字列の数と親セットの数はどこで変わる可能性がありますか?
4

4 に答える 4

0

正規表現を、必要な構成または形式の任意のセットに一致させることは常に可能です。ただし、一連のフォーマットに一致させるために必要な文字列の中には、信じられないほど長いものもあります。これはそれほど悪くありません:

re.match(r"\( \w+ (\|\| \w+ )*\)( && \( \w+ (\|\| \w+ )*\))*$", new_string)

これは一致します:

( replace )
( replace || replace || replace )
( replace || replace ) && ( replace )
( replace || replace ) && ( replace || replace ) && ( replace || replace )
于 2013-06-20T15:25:38.490 に答える
0

正規表現を使用しません。

def is_valid(s):
    def surrounded_by_parens(s, next_validation):
        s = s.strip()
        return s.startswith('(') and s.endswith(')') and next_validation(s[1:-1])
    def separated_by_bars(s):
        return all(x.strip() == 'replace' for x in s.split('||'))
    return all(surrounded_by_parens(x, separated_by_bars) for x in s.split('&&'))

assert is_valid("(replace || replace) && (replace || replace || replace)")
assert is_valid("(replace || replace)")
assert not is_valid("(replace replace) && (replace || replace || replace)")
assert not is_valid("(replace || replace) (replace || replace || replace)")
于 2013-06-20T15:12:08.623 に答える