假设我想匹配:
PREFIX的东西
或:
东西 POSTFIX
但肯定不:
PREFIX的东西 POSTFIX
某些东西是某种共享模式,而PREFIX / POSTFIX实际上也是某些不同的模式。
我可以(或者想)在Python中解决这个问题。然而,这种结构适用于' PREFIXabc'但不适用于' abcPOSTFIX'。怎么解决这个问题?
import re
prefix_pattern = "PREFIX"
postfix_pattern = "POSTFIX"
shared_pattern = "[a-zA-z]*"
test_pattern ="("+prefix_pattern+shared_pattern+")|("+shared_pattern+postfix_pattern+")$"
pattern = re.compile(test_pattern)
#test = 'PREFIXabc' # Match
test = 'abcPOSTFIX' # No match
x = re.match(pattern,test)
if x:
print(x.group())
else:
print("Not found")
答案 0 :(得分:1)
请注意,与re.match
一起使用时,您的模式遵循^(alternative1)|^(alternative2)$
之类的方案。这意味着字符串锚点的$
结尾仅影响第二种备选方案,如果是test = 'PREFIXabc123'
,PREFIXabc
will get matched。
根据您的要求,有两种方法可以解决问题。
您需要删除$
,然后您还会匹配abcPOSTFIX
中的test = 'abcPOSTIFX123'
,或将这两种选择分组:
test_pattern=r"(?:{0}{1}|{1}{2})$".format(prefix_pattern, shared_pattern, postfix_pattern)
然后,将不再发现部分匹配。
和我们:如果prefix_pattern
,shared_pattern
和postfix_pattern
是文字字符串,请不要忘记使用re.escape()
。