在列表中,我需要匹配特定的实例,但特定的字符串组合除外:
让我们说我有一个字符串列表,如下所示:
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
我的正则表达没有做过滤,我错过了什么?
答案 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']