熊猫正则表达式,用char替换group

时间:2020-01-09 16:39:26

标签: python regex pandas

问题

在给出以下数据框的情况下,如何用_替换X:

data = {'street':['13XX First St', '2XXX First St', '47X Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 

需要编辑街道,用下划线_替换每个X。

请注意,整数的数量和X的数量也会发生变化。同样,街道名称(例如Xerxes)不应编辑为_er_es,而应保留为未编辑状态。仅街道号码部分应更改。

所需的输出

data = {'street':['13__ First St', '2___ First St', '47_ Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 

进度

一些潜在的正则表达式构建基块包括:
1. [0-9] +捕获数字
2. X +捕获Xs
3.([0-9] +)(X +)捕获组

df['street']replace("[0-9]+)(X+)", value=r"\2", regex=True, inplace=False)

我对正则表达式非常不满意,所以我的方法可能不是最好的方法。抢先感谢您的任何指导或解决方案!

3 个答案:

答案 0 :(得分:3)

IIUC,这样做:

def repl(m):
    return m.group(1) + '_'*len(m.group(2))

df['street'].str.replace("^([0-9]+)(X*)", repl)

输出:

0     13__ First St
1     2___ First St
2    47_ Second Ave
Name: street, dtype: object

答案 1 :(得分:2)

IIUC,我们可以将函数传递给repl参数,就像re.sub

def repl(m):
    return '_' * len(m.group())

df['street'].str.replace(r'([X])+',repl)

out:

0     13__ First St
1     2___ First St
2    47_ Second Ave
Name: street, dtype: object

如果您只需要在数字后进行匹配,我们可以添加一个'\d{1}',该数字仅在单个X实例之后进行匹配

df['street'].str.replace(r'\d{1}([X]+)+',repl)

答案 2 :(得分:0)

假设“ X”仅出现在“街道”列中

streetresult=re.sub('X','_',str(df['street']))

您想要的输出应该是结果

我测试过的代码

import pandas as pd
import re

data = {'street':['13XX First St', '2XXX First St', '47X Second Ave'], 
        'city':['Ashland', 'Springfield', 'Ashland']} 
df = pd.DataFrame(data) 
for  i in data:
    streetresult=re.sub('X','_',str(df['street']))
print(streetresult)