RegEx:如何匹配前缀+共享或共享+后缀?

时间:2017-09-18 07:01:10

标签: python regex

假设我想匹配:

  

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")

1 个答案:

答案 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_patternshared_patternpostfix_pattern是文字字符串,请不要忘记使用re.escape()