Python正则表达式:查找并替换引号之间的逗号

问题描述 投票:2回答:3

我有一个字符串,

line = '12/08/2013,3,"9,25",42:51,"3,08","12,9","13,9",159,170,"3,19",437,'

并且我想在引号之间找到逗号并将其替换为“:”。寻找结果

line = '12/08/2013,3,9:25,42:51,3:08,12:9,13:9,159,170,3:19,437,'

到目前为止,我已经能够匹配此模式,

import re
re.findall('(\"\d),(.+?\")', line)

但是,我想我应该使用

re.compile(...something..., line)
re.sub(':', line)

有人知道该怎么做吗?谢谢,labjunky

python regex
3个回答
7
投票
>>> import re
>>> line = '12/08/2013,3,"9,25",42:51,"3,08","12,9","13,9",159,170,"3,19",437,'
>>> re.sub(r'"(\d+),(\d+)"', r'\1:\2', line)
'12/08/2013,3,9:25,42:51,3:08,12:9,13:9,159,170,3:19,437,'

[\1\2是指匹配的组。


非正则表达式解决方案:

>>> ''.join(x if i % 2 == 0 else x.replace(',', ':')
            for i, x in enumerate(line.split('"')))
'12/08/2013,3,9:25,42:51,3:08,12:9,13:9,159,170,3:19,437,'

0
投票
import re
line = '12/08/2013,3,"9,25",42:51,"3,08","12,9","13,9",159,170,"3,19",437,'
r = ""
for t in re.split(r'("[^"]*")', line):
    if t[0] == '"': 
        t = t.replace(",", ":")[1:-1]
    r += t
print r

打印:

12/08/2013,3,9:25,42:51,3:08,12:9,13:9,159,170,3:19,437,

0
投票

还有一种通用的正则表达式解决方案,用于替换双引号(或单引号)之间的任何类型的固定(和非固定的)模式:用相应的模式匹配双引号或单引号的子字符串,并使用可调用的作为re.sub的替代参数,您可以在其中操纵比赛:

  1. 用逗号替换双引号之间的逗号,并删除双引号(当前OP方案):

    re.sub(r'"([^"]*)"', lambda x: x.group(1).replace(',', ':'), line)demo# => 12/08/2013,3,9:25,42:51,3:08,12:9,13:9,159,170,3:19,437,

  2. 用逗号将双引号之间的逗号替换,并将keep用双引号引起来:

    re.sub(r'"[^"]*"', lambda x: x.group(0).replace(',', ':'), line)demo# => 12/08/2013,3,"9:25",42:51,"3:08","12:9","13:9",159,170,"3:19",437,

  3. 用逗号将双引号(keep]替换为逗号:re.sub(r''''[^']*'|"[^"]*"''', lambda x: x.group(0).replace(',', ':'), '''0,1,"2,3",'4,5',''')demo# => 0,1,"2:3",'4:5',

    [此外,如果需要处理转义的单引号和双引号,请考虑使用r"'[^\\']*(?:\\.[^\\']*)*'"(对于单引号的子字符串),r'"[^\\"]*(?:\\.[^\\"]*)*"'(对于双引号的子字符串)或同时使用-r''''[^\\']*(?:\\.[^\\']*)*'|"[^\\"]*(?:\\.[^\\"]*)*"''',而不是上面的模式。] >

© www.soinside.com 2019 - 2024. All rights reserved.