在正则表达式匹配和否定条件后获取文本

Getting the text after a regex match and a negative condition

我正在练习我的正则表达式技能,试图过滤交易中与 BNB 不同的 'token'。

举个例子:

原文:

['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”)

仅供您个人参考,网站 regex101 是 t/s 您正在寻找的内容的绝佳资源。这是我写的应该准确提取您想要的文本的内容:

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

现在让我们花点时间谈谈这一切意味着什么:

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

基于您提供的字符串。这应该很好地提取您正在寻找的信息。我在你的文本上试过了,它只抓取了我在第 4 组中想要的内容。我希望这能解决问题![​​=12=]

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

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

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

说明

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

看到一个regex demo and a Python 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']