Python 根据正则表达式匹配替换字符串中的字符?
我想替换pandas中字符串中的一些字符(基于与整个字符串的匹配),同时保留字符串的其余部分不变 例如,如果破折号不在数字字符串的开头,请将数字字符串中的破折号替换为小数: “26.15971”->“26.15971” “1030899”->“1030899” “26-404700”->“26.404700” '-26-403268'->'-26.403268' 代码:Python 根据正则表达式匹配替换字符串中的字符?,python,regex,pandas,Python,Regex,Pandas,我想替换pandas中字符串中的一些字符(基于与整个字符串的匹配),同时保留字符串的其余部分不变 例如,如果破折号不在数字字符串的开头,请将数字字符串中的破折号替换为小数: “26.15971”->“26.15971” “1030899”->“1030899” “26-404700”->“26.404700” '-26-403268'->'-26.403268' 代码: 您可以尝试将regex替换为lookarounds: df["col1"] = df["col1
您可以尝试将regex替换为lookarounds:
df["col1"] = df["col1"].str.replace("(?<=\d)-(?=\d)", ".")
很不错的!因此,我认为正向前瞻不能像
(?@Mark_Anderson)那样是可变宽度的。事实上,你可以使用可变宽度的正向前瞻,因此这也是合理的:(?同意,但有没有办法在前瞻中获得灵活性?我仍然非常喜欢这个解决方案,但不知道是否有办法获得完全的灵活性(如果lookbehind不能灵活,可能会得到3个捕获组(\d{2,3})(?P-)(\d{4,8})
,并且只交换具有hypen的中间捕获组?)@Mark_Anderson我不知道你为什么认为你需要这个,但我还是更新了我的答案。我认为,在这里,只要断言破折号两边都有一个数字就可以了。这只是一个一般原则。更灵活更好。主要是为了防止有类似问题的人出现在这篇帖子上。
df["col1"] = df["col1"].str.replace("(?<=\d)-(?=\d)", ".")
df["col1"] = df["col1"].str.replace("(\d{2,3})-(\d{4,8})", "\\1.\\2")