使用正则表达式匹配字符串,但特定字符串组合除外

时间:2017-10-24 13:33:48

标签: python regex python-2.7 regex-negation

在列表中,我需要匹配特定的实例,但特定的字符串组合除外:

让我们说我有一个字符串列表,如下所示:

l = [
'PSSTFRPPLYO',
'BNTETNTT',
'DE52 5055 0020 0005 9287 29',
'210-0601001-41',
'BSABESBBXXX',
'COMMERZBANK'
]

我需要匹配指向swift / bic code的所有单词,此代码具有以下形式: 后跟6个字母 2个字母/数字后跟 3个可选字母/数字

因此我写了以下正则表达式以匹配这种特定模式

import re
regex = re.compile(r'(?<!\w)[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?(?!\w)')
for item in l:
    match = regex.search(item)
    if match:
        print('found a match, the matched string {} the match {}'.format( item, item[match.start() : match.end()]
    else:
        print('found no match in {}'.format(item)

我需要将以下案例联系起来:

result = ['PSSTFRPPLYO', 'BNTETNTT', 'BSABESBBXXX' ]

而不是我

result = ['PSSTFRPPLYO', 'BNTETNTT', 'BSABESBBXXX', 'COMMERZBANK' ]

所以我需要的是只匹配不包含“&#39; bank&#39;

这个词的字符串

这样做我已经将我的正则表达式改进为:

regex = re.compile((?<!bank/i)(?<!\w)[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?(?!\w)(?!bank/i))

我简单地使用负面看后面和前面有关这两个概念的更多信息参考link

我的正则表达没有做过滤,我错过了什么?

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

import re
final_vals = [i for i in l if re.findall('^[a-zA-Z]{6}\w{2}|(^[a-zA-Z]{6}\w{2}\w{3})', i) and not re.findall('BANK', i, re.IGNORECASE)]

输出:

['PSSTFRPPLYO', 'BNTETNTT', 'BSABESBBXXX']