Python re.sub取代了所有内容而不是一个组

时间:2018-04-25 14:06:16

标签: python regex

因此。我有一个字符串,需要将;所包围的每个"替换为, (例如;中的"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" --> ,

2 个答案:

答案 0 :(得分:0)

如果您在;内只需要一个"..."替换,则可以使用

修复您的方法
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

答案 1 :(得分:0)

你可以试试这个,

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

我可以说,你的正则表达式中的"[^"]*(;)[^"]*"匹配双引号内的所有字符串,并将其替换为“,”,因此产生了这样的输出。