2017-09-18 151 views
2

假設我想匹配:正則表達式:如何匹配前綴+共享OR共享+後綴?

PREFIX 東西

或:

東西字尾

但可以肯定的NOT

PREFIX 東西字尾

東西一定的共享模式,並PREFIX /字尾是在現實中也一定不同的模式。

我可以(或以爲)在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

那麼它似乎不是真正的輸入,你不需要'$'? – revo

+0

請注意:您的'$'隻影響第二種選擇。爲了使它同時受到影響,可以使用'test_pattern =「({0} {1} | {1} {2})$」格式(prefix_pattern,shared_pa​​ttern,postfix_pattern) –

回答

1

請注意,您的模式,與re.match使用時,遵循類似^(alternative1)|^(alternative2)$方案。這意味着字符串錨的$結束僅影響第二個替代方案,並且在test = 'PREFIXabc123',PREFIXabc will get matched的情況下。

根據您的要求,有兩種方法可以解決這個問題。

要麼你需要刪除$,然後你也將在test = 'abcPOSTIFX123'匹配abcPOSTFIX,或組的兩個備選方案:

test_pattern=r"(?:{0}{1}|{1}{2})$".format(prefix_pattern, shared_pattern, postfix_pattern) 

然後,部分匹配將不會繼續發現。

而且僅供參考:如果prefix_pattern,shared_patternpostfix_pattern是文字字符串,請不要忘記使用re.escape()