【问题标题】:Match string using regular expression except specific string combinations python使用正则表达式匹配字符串,除了特定的字符串组合python
【发布时间】: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


【解决方案1】:

你可以试试这个:

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']

【讨论】:

  • 有没有办法在正则表达式中包含条件?不要将字符串遍历两次,不要误会我的意思,您的解决方案可以完成这项工作,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2014-10-08
  • 2020-11-29
  • 2011-11-28
相关资源
最近更新 更多