【问题标题】:Getting the text after a regex match and a negative condition在正则表达式匹配和否定条件后获取文本
【发布时间】:2021-10-24 06:51:03
【问题描述】:

我正在练习我的正则表达式技巧,试图在交易中过滤不同于BNB 的“令牌”。

这是一个例子:

原文:

['Sender Receiver Amount Currency',
 '0x10ed43c718714eb63d5aa57b78b54704e256024e',
 '0x5b9f811d38fc6c1017e0774c552235b33f564deb',
 '1.00 WBNB',
 '0x10ed43c718714eb63d5aa57b78b54704e256024e',
 '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c',
 '1.00 BNB',
 '0x5b9f811d38fc6c1017e0774c552235b33f564deb',
 '0x6b1ecb203d82fec24f8b684f7906ef98ec9abf0a',
 '596.32 RBH',
 '0x6b1ecb203d82fec24f8b684f7906ef98ec9abf0a',
 '0x10ed43c718714eb63d5aa57b78b54704e256024e',
 '1.00 BNB',
 '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c',
 '0x10ed43c718714eb63d5aa57b78b54704e256024e',
 '1.00 WBNB']

这是我用于尝试的正则表达式:

'(((?<=\d\w ))\w*[^BNB])'

但这是我得到的结果:

[("WBNB'", ''), ("BNB'", ''), ("RBH'", ''), ("BNB'", ''), ("WBNB'", '')]

知道正确的方法来获得我需要的东西吗? (在这种情况下只有“RBH”)

【问题讨论】:

  • [^...]是字符集的否定,即不匹配括号内的任何字符,在这种情况下,它只是意味着匹配不以BN结尾的东西。跨度>
  • 长度重要吗?我们是否应该过滤WWBNBABCBNB 之类的内容。 BNB 后面的字符如BNBWBNBABCBNB 中间的WBNBW 怎么样?

标签: python regex regex-negation


【解决方案1】:

试试这个(((?&lt;=\d\w ))\w*[A-Z]{0,1}[^N][^B](?='))

【讨论】:

  • 感谢@codographer,也感谢 Eric,他的方法也解释了很多 ?
【解决方案2】:

您可以对单个捕获组使用负前瞻:

\d (?![A-Z]*BNB)([A-Z]+)

说明

  • \d 匹配一个数字和一个空格
  • (?![A-Z]*BNB) 负前瞻,断言不是可选字符 A-Z,然后是右侧的 BNB
  • ([A-Z]+) 捕获组 1,匹配 1+ 个字符 A-Z

查看regex demoPython demo

示例代码

import re

strings = ['Sender Receiver Amount Currency', '0x10ed43c718714eb63d5aa57b78b54704e256024e', '0x5b9f811d38fc6c1017e0774c552235b33f564deb', '1.00 WBNB', '0x10ed43c718714eb63d5aa57b78b54704e256024e', '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', '1.00 BNB', '0x5b9f811d38fc6c1017e0774c552235b33f564deb', '0x6b1ecb203d82fec24f8b684f7906ef98ec9abf0a', '596.32 RBH', '0x6b1ecb203d82fec24f8b684f7906ef98ec9abf0a', '0x10ed43c718714eb63d5aa57b78b54704e256024e', '1.00 BNB', '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c', '0x10ed43c718714eb63d5aa57b78b54704e256024e', '1.00 WBNB']
pattern = r"\d (?![A-Z]*BNB)([A-Z]+)"

for s in strings:
    m = re.search(pattern, s)
    if m:
        print(m.group(1))

输出

['RBH']

【讨论】:

    【解决方案3】:

    仅供您个人参考,regex101 网站是一个很好的资源,可以准确地传递您正在寻找的内容。这是我写的应该准确提取您想要的文本的内容:

    ((\d )((?!.BNB)(?!BNB)(?!BNB.))(\w*))
    

    现在让我们谈谈这一切的意义:

    1. \d 正在寻找文本开头的数字
    2. ?!排除中间的所有三种模式(任何以 BNB 结尾、以 BNB 开头或为 BNB 的模式)
    3. 结尾部分只是在寻找剩下的东西

    基于您提供的字符串。这应该可以很好地提取您正在寻找的信息。我在你的文字上试过了,它只抓住了我在第 4 组中想要的东西。我希望它能清除它!

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多