【问题标题】:Python regex lookahead with 2 negative conditions具有 2 个否定条件的 Python 正则表达式前瞻
【发布时间】:2017-06-02 21:50:28
【问题描述】:

在 Python 中,我遇到了一个正则表达式的问题,它在前瞻中有 2 个否定条件。这似乎应该很容易,但不知何故,经过多次尝试后我没有看到解决方案......

我有大段文字,其中包括:

受益人

受益人账户

收款银行

我想要的是:

受益人姓名

受益人账户

收款银行

我不想错误地改变

受益人姓名

因为这可能会导致

受益人姓名账户

受益人姓名银行

也就是说,我要改变

“受益人”到“受益人姓名”

当且仅当 “受益人”后面没有“账户” 和 “受益人”后面没有“银行”

但是如何使用 AND 测试两个前瞻以确保满足这两个条件?

在正则表达式中,我只看到 OR - 像这样: bene_lookahead_or = r'beneficiary\s?(?!acct) |受益人\s?(?!bank)'

有 Python 正则表达式 AND 吗? 如果没有,是否有 Python 正则表达式否定方式? 也就是说,像布尔代数 NOR 一样否定 OR 如 将受益人更改为受益人姓名 如果不 ( 受益人后跟act 或者 受益人后面是银行 )

我显然在这里遗漏了一些东西...... 感谢您的帮助!

【问题讨论】:

    标签: python regex boolean-logic lookahead negative-lookahead


    【解决方案1】:

    NOR's 在否定的任何事物中,例如 或断言,
    自动否定每个项目并ANDed在一起。

    在您的示例中,这将是这种用法beneficiary(?![ ](?:acct|account|bank))

    展开

     beneficiary
     (?!                           # Negative assertion
          [ ]                           # Space
          (?:                           # Not any of these
               acct
            |  account                       
            |  bank 
          )
     )
    

    【讨论】:

    • sin:谢谢 - 这帮助我解决了我的问题。非常感谢!
    • @sm_ninja - 没问题。如果有任何答案有助于解决您的问题,您可以点赞和/或将其标记为已解决。
    【解决方案2】:

    您可以尝试使用最后一个替代为空字符串的替代,并一次性完成:

    s = '''beneficiary
    
    beneficiary acct
    
    beneficiary bank'''
    
    pat = re.compile(r'\bbeneficiary( acct| bank|)\b')
    rep = { ' acct':' account', ' bank':' bank' }
    
    result = pat.sub(lambda m: 'beneficiary{0}'.format(rep[m.group(1)]) if m.group(1) else 'beneficiary name', s)
    

    【讨论】:

    • Casimir et Hippolyte:感谢您的反馈。我在这里看到了一些我可以学习的代码,这些代码总是受欢迎的。此外,它帮助我意识到我没有清楚地解释我的问题 - 我下次要考虑的事情......我可能有“受益人{这里的各种文本项目......}。{更多不同的文本}受益人帐户{更多文本}... ... 受益银行 {more text}... 并且其中部分或全部或不存在,并且没有特定顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2018-12-28
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多