为何re.search('|')匹配DataFrame元素时结果不符合预期?
问题分析:正则匹配意外输出所有First列元素的原因
问题重现
代码
import pandas as pd import numpy as np import re df_test = pd.DataFrame(np.array([['a|b', 'b', 'c|r'], [ 'e', 'f', 'g']]), columns=['First', 'Second', 'Third']) for elem in df_test.get('First'): x = bool(re.search('|', elem)) if x == True: print(elem)
实际输出
a|b e
预期输出
a|b
问题原因
你使用的正则表达式'|'是正则中的特殊元字符,代表“逻辑或”。单独写'|'等价于匹配''|''——也就是匹配空字符串,而任何非空字符串中都存在空字符串(比如字符串开头、结尾或字符间隙),所以re.search('|', elem)对所有非空元素都会返回匹配结果,转成布尔值后为True,导致'e'也被打印。
修正方案
有两种简洁的解决方式:
- 转义正则特殊字符:将
|转义为普通字符,使用原始字符串r'\|'或者双反斜杠'\\|',这样只会匹配实际存在的|符号:
for elem in df_test.get('First'): x = bool(re.search(r'\|', elem)) if x: print(elem)
- 直接用字符串包含判断:如果只是检查字符串中是否存在
|,用Python原生的in操作符更高效,无需正则:
for elem in df_test.get('First'): if '|' in elem: print(elem)
内容的提问来源于stack exchange,提问作者Mikhail Rotar
相关产品推荐
相关产品推荐

