Python中使用正则查找以太坊地址返回空值的问题排查
问题原因
- 正则锚点使用错误:
^标记整个字符串的起始位置,$标记整个字符串的结束位置,你写的^0x[a-fA-F0-9]{40}$规则,只有当传入的整段字符串完全就是一个以太坊地址、前后没有任何其他字符时才能匹配成功。但你的row变量里两个地址前后都夹杂了其他普通字符,自然返回空结果。 re.findall用法错误:当正则表达式没有定义捕获组时,findall会直接返回所有匹配结果组成的字符串列表,不是正则匹配对象。你原有代码里遍历调用match.group()会直接抛出属性错误,因为字符串类型没有group()方法。
修正方案
去掉正则里多余的^和$锚点,同时调整遍历逻辑,不需要调用group()方法:
import re row = 'afdsf1 asdfasdf0xc7d688cb053c19ad5ee4f48c348958880537835fdsgdsfg 0xc7d688cb053c19ad5ee4f48c348958880537835f' all_match = re.findall(pattern=r'0x[a-fA-F0-9]{40}', string=row) for match in all_match: print(match) print(all_match)
运行后输出结果:
0xc7d688cb053c19ad5ee4f48c348958880537835f 0xc7d688cb053c19ad5ee4f48c348958880537835f ['0xc7d688cb053c19ad5ee4f48c348958880537835f', '0xc7d688cb053c19ad5ee4f48c348958880537835f']
补充说明:如果你的业务场景要求以太坊地址前后不能紧跟其他字母/数字,避免匹配到长字符串里截断的无效片段,可以把正则改成
r'(?<![a-fA-F0-9])0x[a-fA-F0-9]{40}(?![a-fA-F0-9])',通过前后负向断言过滤不符合边界要求的结果。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

