在正则表达式匹配和否定条件后获取文本
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*))
现在让我们花点时间谈谈这一切意味着什么:
- \d 正在查找文本开头的数字
- ?!排除中间的所有三种模式(任何以 BNB 结尾、以 BNB 开头或是 BNB 的东西)
- 结尾就是找剩下的东西
基于您提供的字符串。这应该很好地提取您正在寻找的信息。我在你的文本上试过了,它只抓取了我在第 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']
我正在练习我的正则表达式技能,试图过滤交易中与 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*))
现在让我们花点时间谈谈这一切意味着什么:
- \d 正在查找文本开头的数字
- ?!排除中间的所有三种模式(任何以 BNB 结尾、以 BNB 开头或是 BNB 的东西)
- 结尾就是找剩下的东西
基于您提供的字符串。这应该很好地提取您正在寻找的信息。我在你的文本上试过了,它只抓取了我在第 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']