Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据正则表达式匹配替换字符串中的字符?_Python_Regex_Pandas - Fatal编程技术网

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

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

我想替换pandas中字符串中的一些字符(基于与整个字符串的匹配),同时保留字符串的其余部分不变

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

“26.15971”->“26.15971”

“1030899”->“1030899”

“26-404700”->“26.404700”

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

代码:


您可以尝试将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")