Python回复sub替换所有内容而不是一个组

2024-07-04 16:12:52 发布

您现在位置:Python中文网/ 问答频道 /正文

所以。我有一个字符串,需要替换被",包围的每个; (例如;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%**!!!;!!!** 60-69% CACAO SOL"中)

代码

import re
a = '19905;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%; 60-69% CACAO SOL";1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0'
print(re.sub('"[^"]*(;)[^"]*"', ',', a))

唯一的问题是它输出

19905;,;1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0

而不是

19905;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%, 60-69% CACAO SOL";1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0

为什么它会替换整个匹配的部分

"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%, 60-69% CACAO SOL" --> ,

Tags: 字符串代码importrebarprintdknfs
2条回答

如果在"..."中只有一个;要替换,那么可以使用

import re
a = '19905;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%; 60-69% CACAO SOL";1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0'
print(re.sub('("[^"]*);([^"]*")', r'\1,\2', a))
# => 19905;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%, 60-69% CACAO SOL";1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0

其中(...)放在需要保留的零件周围,然后在替换中使用占位符\1\2。你知道吗

this Python demo。你知道吗

否则,使用

import re
a = '19905;"CANDIES,CHOC,DK,NFS (45-59% CACAO SOL 90%; 60-69% CACAO SOL";1;550;5,09;32,2;1,74;59,97;7,2;46,14;57;8,13;152;214;568;23;2,11;1,076;1,44;3,5;0;0,026;0,051;0,747;0,304;0,041;0;0;0;0;27,6;0,23;49;2;0;7;25;1;0;31;0,55;0;0;8;18,993;9,801;1,107;7;28,35;1 oz;127;1 bar;0'
print(re.sub('"[^"]*"', lambda x: x.group().replace(';', ','), a))

用逗号替换双引号子字符串中的所有;。见another Python demo。你知道吗

你可以试试这个

import regex as re     
print(re.sub(r'(?<="[^"]*);(?=[^"]*")',',',a))

我也可以说,regex中的"[^"]*(;)[^"]*"匹配双引号内的所有字符串,并用,替换它,这样就产生了这样的输出。你知道吗

相关问题 更多 >

    热门问题