2017-10-16 65 views
2

我有下面的字符串,我能够抓住'text'我想(文本之间扭曲模式)。代码是下面给出,蟒蛇搜索和更新字符串与正则表达式

val1 = '[{"vmdId":"Text1","vmdVersion":"text2","vmId":"text3"},{"vmId":"text4","vmVersion":"text5","vmId":"text6"}]' 


temp = val1.split(',') 
list_len = len(temp) 

for i in range(0, list_len): 
    var = temp[i] 
    found = re.findall(r':"([^(]*)\&quot\;', var) 
    print ''.join(found) 

我想替换值(文本1,文本2,tex3等)与由用户提供的新的值/或通过从另一个XML读取。 (文本,TEX2 ..都是完全随机和字母数字数据。下面的一些细节

Text1 = somename 
text2 = alphanumatic value 
text3 = somename 

Text4 = somename 
text5 = alphanumatic value 
text6 = somename 

    anstring = 
[{"vmdId":"newText1","vmdVersion":"newtext2","vmId":"newtext3"},{"vmId":"newtext4","vmVersion":"newtext5","vmId":"newtext6"}] 

我决定去与replace()但后来意识到数据不是恒定的,因此寻求帮助,再次,感谢您的答复。

任何帮助,将不胜感激。另外,如果让,我知道如果我能改善我现在感到掠价值的方式,因为我用正则表达式新。

+0

'anstring'是预期的结果 –

+1

所以它就像JSON,具有键值的对象数组,您尝试替换值。我对吗? –

+1

是你以前知道的字符串text1,text2,text3等吗?还是仅仅基于这种模式放置它们?如果他们是已知的,那么简单地创建一个字典并将这些值映射到newText,这将被替换,并使用'.replace()替换所有。如果值已知,则可能甚至不需要在这里。 – MohitC

回答

2

您可以通过与重新组合使用backreferences做到这一点。 sub:

import re 
val1 = '[{"vmdId":"Text1","vmdVersion":"text2","vmId":"text3"},{"vmId":"text4","vmVersion":"text5","vmId":"text6"}]' 

ansstring = re.sub(r'(?<=:&quot;)([^(]*)', r'new\g<1>' , val1) 

print ansstring 

\g<1>是在第一个()中的文本。

编辑

也许更好的做法是字符串解码,更改数据,并再次对其进行编码。这应该可以让您更轻松地访问这些值。

import sys 

# python2 version 
if sys.version_info[0] < 3: 
    import HTMLParser 
    html = HTMLParser.HTMLParser() 
    html_escape_table = { 
     "&": "&amp;", 
     '"': "&quot;", 
     "'": "&apos;", 
     ">": "&gt;", 
     "<": "&lt;", 
     } 

    def html_escape(text): 
     """Produce entities within text.""" 
     return "".join(html_escape_table.get(c,c) for c in text) 

    html.escape = html_escape 
else: 
    import html 

import json 

val1 = '[{&quot;vmdId&quot;:&quot;Text1&quot;,&quot;vmdVersion&quot;:&quot;text2&quot;,&quot;vmId&quot;:&quot;text3&quot;},{&quot;vmId&quot;:&quot;text4&quot;,&quot;vmVersion&quot;:&quot;text5&quot;,&quot;vmId&quot;:&quot;text6&quot;}]' 
print(val1) 

unescaped = html.unescape(val1) 
json_data = json.loads(unescaped) 
for d in json_data: 
    d['vmId'] = 'new value' 

new_unescaped = json.dumps(json_data) 
new_val = html.escape(new_unescaped) 
print(new_val) 

我希望这有助于。

+2

我有这个工作,通过使用这个:'ansstring = re.sub(r '(?<=:")([^(] *)',r'new \ g <1>',val1)' –

+0

因为您的脚本也替换了引号 –

+0

感谢您指出这一点我改变了答案 –