【问题标题】:Regex Grouping and extraction of particular group based on regex look behindRegex Grouping and extracting based on regex look behind
【发布时间】:2018-02-08 13:11:19
【问题描述】:

我想提取以下文本中出现“ID”后的数字 这就是我能够得到它的方式。

import re

txt="Recharge done on 28-12-2017 04:57PM,MRP:Rs9.00,GST 18% payable by Company/Distributor/Retailer:Rs1.37, ID 147894886."

# 'ID' need to be present as mandatory group
regex = '(id)(.*?)(\d+})' 

rg = re.compile(regex ,re.IGNORECASE|re.DOTALL)
m = rg.search(txt)
if m:
    print m.group(3)

当我运行以下代码时,它会打印出来

147894886

问题来了

如果txt变成这样

txt="Recharge done on 28-12-2017 04:57PM,MRP:Rs9.00,GST 18% payable by Company/Distributor/Retailer:Rs1.37, TransID 147894886."

并且“ID”之前出现“Trans”字样,然后我不想提取数字。如何在正则表达式中执行此操作(即,如果“TransID”出现在数字之前,则不提取数字,但仅当“ID”出现时才提取数字)

【问题讨论】:

  • 您是专门寻找trans 还是要确保id 是一个完整的单词。如果是后者,请参阅stackoverflow.com/questions/1751301/…
  • 我要确保ID前的字符不应该是'(trans|trx|transc)'等

标签: python regex python-2.7 regex-negation regex-lookarounds


【解决方案1】:

您可以使用否定的后视 [doc] :

(?<!trans)(id)(.*?)(\d+)

Demo

或者,正如 Sebastian Proske 所建议的,您可以使用单词边界:

\b(id)(.*?)(\d+)

Demo

【讨论】:

  • 如果我想使用这个正则表达式怎么办 ->>> (?
  • 如果有多种负面回溯的可能性,例如。 transacid OR transid OR trxid 那么它也不应该匹配并返回组
  • 您可以将排除的字符串分隔在几个否定的后向组中:like here
  • 工作就像一个魅力。我不知道可以那样做。非常感谢 !干杯:)
【解决方案2】:

您可以使用单词边界 (\b) 来确保 ID 是一个完整的单词。

\b(id)(.*?)(\d+)

这也可能有助于减少您的模式的普遍匹配。如果你总是有ID 后跟一个空格,然后是 9 个数字,你可以使用这个正则表达式:

\b(id)([ ])(\d{9})

Pythex Demo

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2011-02-06
    • 2020-02-07
    • 1970-01-01
    • 2014-09-12
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多