我输入的单个字符串看起来像
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]
答案 0 :(得分:0)
尝试以下模式:
r'(foo(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\])))'
请参见demo
故障:
(foo(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\])))
(?:(?:\[[A-Z]\]\[\d+\])|(?:\[\d+\]\[[A-Z]\]))
(?:\[[A-Z]\]\[\d+\])
(?:\[[A-Z]\]\[\d+\])
\[
与字符[从字面上匹配(区分大小写)
[A-Z]
下面的列表中存在的单个字符A-Z
在A(索引65)和Z(索引90)(区分大小写)之间的单个字符(?:\[\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]