【发布时间】:2017-10-24 13:33:48
【问题描述】:
在一个列表中,我需要匹配特定的实例,除了特定的字符串组合:
假设我有一个字符串列表,如下所示:
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' ]
所以我需要的是只匹配不包含单词“bank”的字符串
为此,我将正则表达式改进为:
regex = re.compile((?<!bank/i)(?<!\w)[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?(?!\w)(?!bank/i))
关于这两个概念的更多信息,我只是在前后使用了负面观察,请参阅link
我的正则表达式没有进行预期的过滤,我错过了什么?
【问题讨论】:
-
(?!.*bank.*)^[a-z]{6}(?:[a-z0-9]{2})(?:[a-z0-9]{3})?$与i修饰符? -
@ctwheels 这是一个不错的技巧,非常感谢。
-
我之前的正则表达式实际上可以缩短为
(?!.*bank.*)^[a-z]{6}(?:[a-z0-9]{2}|[a-z0-9]{5})$(少 4 个字符,少 2 个步骤)或(?![a-z0-9]*bank[a-z0-9]*)^[a-z]{6}(?:[a-z0-9]{2}|[a-z0-9]{5})$(更多字符,但少了近 400 个步骤) -
@ctwheels 你用什么来分析步数?
标签: python regex python-2.7 regex-negation