我在Pandas中的数据(df ['case'])包含两种引用美元金额的方式:
不同之处在于空白。我现在想将“ USD”替换为“ USD”,但前提是USD后面跟随数字-同时保留数字。
df['case'] = df['case'].str.replace('USD ', 'USD', re.IGNORECASE)
将不起作用,因为它还会包含没有数字后跟的实例(请参见第三个示例)。
df['case'] = df['case'].str.replace('USD (\d+)', 'USD', re.IGNORECASE)
这将仅匹配后跟数字但也替换数字的情况。有没有办法告诉它找到变量,然后替换变量以外的所有内容?基本上:
df['case'] = df['case'].str.replace('USD (\d+)', 'USD(\d+)', re.IGNORECASE)
第二个(\ d +)不是按字面意义使用的,而是前面的数字的占位符,它将再次插入此处。
我也尝试过:
for row in df['case'].str.contains('USD (\d+), re.IGNORECASE):
df['case'] = df['case'].str.replace('USD ', 'USD', re.IGNORECASE)
后者不能迭代行,而只能在包含字符串的行中执行更改。后者的解决方案还将极大地解决其他问题。
答案 0 :(得分:1)
使用
(?i)USD\s+(?=\d)
详细信息
(?i)
-启用不区分大小写的搜索USD
-文字USD
\s+
-1个以上的空格字符(?=\d)
-(确保前瞻性)下一个字符应为不会添加到匹配值的数字,因此不会被替换。在熊猫中:
df['case'] = df['case'].str.replace(r'(?i)USD\s+(?=\d)', 'USD')
请参见regex demo
如果您需要将USD
保留为原始格式,请使用
df['case'] = df['case'].str.replace(r'(?i)(USD)\s+(?=\d)', r'\1')
也就是说,将USD
捕获到捕获组中,然后使用\1
反向引用/占位符从字符串替换模式中引用该组值。