如何使用python中的正则表达式修改字符串中的文本?

时间:2013-12-18 21:49:18

标签: python regex

我正在尝试更改包含以下字符串的文件:

Record 1 : 
{ "K1":"value1" , 
  "K2":"value2" 
}

Record 2 :
{ "K1":"value3" , 
  "K2":"value4" 
}

{
    "Record_1" : 
        { "K1": "value1", 
          "K2": "value2" 
    }, 

    "Record_2" :
        { "K1": "value3", 
          "K2": "value4" 
        }
}

(使其成为正确的JSON格式) 我遇到问题的代码部分是:

pattern = r"(\s*)Record (\d+):"
all_records_json = re.sub(middle_pattern, "\"Record_"+ ??? + "\" : ",all_records)

而且我不知道该放什么而不是???这样它就会读取与模式匹配的(\ d +)部分。

1 个答案:

答案 0 :(得分:0)

首先,您的模式首先与您的数据不匹配:

>>> all_records = '''Record 2 :
... { "K1":"value3" , 
...   "K2":"value4" 
... }'''
>>> pattern = r"(\s*)Record (\d+):"
>>> re.findall(pattern, all_records)
[]

那是因为你的数据在数字和冒号之间有一个空格。你需要解决这个问题。虽然我们正处于这种状态,但我不知道为什么你要围绕前面的空白组成一个小组,所以我们不要这样做。所以我们得到:

>>> pattern = r"\s*Record (\d+)\s*:"
>>> re.findall(pattern, all_records)
[2]

现在,您唯一的捕获组是\d+。因此,这将是第1组。您可以在替换中包含\1。所以:

>>> print(re.sub(pattern, r'"Record_\1": ', all_records))
"Record_2":
{ "K1":"value3" ,
  "K2":"value4"
}

那仍然是无效的JSON,但这是你想要的,对吗?

如果你阅读了文档,re.sub解释说“反向引用,例如\6,将替换为模式中第6组匹配的子字符串。”有关(…)组和(?P<name>…)组的反向引用的完整详细信息,请在Regular Expression Syntax中查找。您还应该阅读Regular Expression HOWTO,它以更加新手友好的方式解释所有这些内容。

请注意,我将替换作为原始字符串就像模式一样,所以我没有必要逃避\1,我也使用单引号而不是双引号,所以我没有逃脱"个字符。