大熊猫根据正则表达式匹配替换字符串中的字符?

时间:2020-10-08 02:46:12

标签: python regex pandas

我想替换大熊猫字符串中的某些字符(基于对整个字符串的匹配),而其余字符串保持不变。

例如,如果破折号不在数字字符串的开头,请在数字字符串中用小数点替换破折号:

'26 .15971'-> '26 .15971'

'1030899'->'1030899'

'26 -404700'-> '26 .404700'

'-26-403268'->'-26.403268'

代码:

# --- simple dataframe
df = pd.DataFrame({'col1':['26.15971','1030899','26-404700']})

# --- regex that only matches items of interest
regex_match = '^\d{1,2}-\d{1,8}'
df.col1.str.match(regex_match)

# --- not sure how to only replace the middle hypens?
# something like  df.col1.str.replace('^\d{1,2}(-)\d{1,8}','^\d{1,2}\.\d{1,8}') ??
# unclear how to get a repl that only alters a capture group and leaves the rest 
# of the string unchanged

1 个答案:

答案 0 :(得分:1)

您可以尝试使用带有正则表达式的正则表达式替换:

df["col1"] = df["col1"].str.replace("(?<=\d)-(?=\d)", ".")

正则表达式模式(?<=\d)-(?=\d)定位两个数字之间的每个破折号,并将其替换为点。

我们也可以使用捕获组来解决这个问题:

df["col1"] = df["col1"].str.replace("(\d{2,3})-(\d{4,8})", "\\1.\\2")