正则表达式仅在子字符串出现一次时匹配

时间:2019-05-24 13:32:32

标签: python regex

我输入的单个字符串看起来像

foo[TAG1][TAG2]

其中TAG1和TAG2是唯一的预定义单词集,并且每个单词只能使用一次。

例如,TAG1 = {A,B,C}和TAG2 = {1、2、3}。

以下应匹配:

  • foo[A][1]
  • foo[B][3]
  • foo[2][B]

以下内容不匹配:

  • foo[A][A]
  • foo[1][3]
  • foo[C][B]
  • foo[C]
  • foo[23]

2 个答案:

答案 0 :(得分:0)

尝试以下模式:

r'(foo(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\])))'

请参见demo


故障:

  • 第一捕获组(foo(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\])))
    • foo从字面上匹配字符foo(区分大小写)
    • 非捕获组(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\]))
      • 第一种选择(?:\[[A-Z]\]\[\d+\])
        • 非捕获组(?:\[[A-Z]\]\[\d+\]) \[与字符[从字面上匹配(区分大小写)
          • 匹配[A-Z]下面的列表中存在的单个字符
          • A-Z在A(索引65)和Z(索引90)(区分大小写)之间的单个字符
          • ]从字面上匹配字符](区分大小写)
          • [与字符[从字面上匹配(区分大小写)
          • \ d +匹配一个数字(等于[0-9])
          • ]从字面上匹配字符](区分大小写)
      • 第二种选择(?:\[\d+\]\[[A-Z]\])
        • 非捕获组(?:\[\d+\]\[[A-Z]\])
          • \[与字符[从字面上(区分大小写)匹配
          • \d+匹配一个数字(等于[0-9])
          • \]从字面上匹配字符](区分大小写)
          • \[与字符[从字面上(区分大小写)匹配
          • 匹配[A-Z]下面的列表中存在的单个字符
          • \]从字面上匹配字符](区分大小写)

答案 1 :(得分:0)

进口:

import re

输入数据:

rules = {
    "TAG1": {"A", "B", "C"},
    "TAG2": {"1", "2", "3"}
}

template = "foo[TAG1][TAG2]"

test_strings = ["foo[A][1]", "foo[B][3]", "foo[2][B]", "foo[A][A]", "foo[1][3]", "foo[C][B]", "foo[C]", "foo[23]"]

代码:

compiled_template = template[:]

for k, v in rules.items():
    if k in template:
        compiled_template = compiled_template.replace(f"[{k}]", f"(?=.*\[({'|'.join(v)})\])")

for string in test_strings:
    if re.match(compiled_template, string):
        print(string)

输出:

foo[A][1]
foo[B][3]
foo[2][B]