2010-06-11 135 views
2

我想用正则表达式来搜索一个UUID数字的文档,并用新的数字替换它的结尾。我到目前为止的代码是:搜索一个字符串,并将其替换为一个变量

read_file = open('test.txt', 'r+') 
write_file = open('test.txt', 'w') 

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 
for l in read_file: 
    m1 = r.match(l) 
    if m1: 
     new=(str,m1.group(2)) 
     new?????? 

这里我卡住了。

文件test.txt具有存储在它下面的UUID:

self.uid = '5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22' 

我想更换部分D15C7F9E1F22

我也试过这样:

r = re.compile(r'(self.uid\s*=\s*)(\S+)') 
for l in fp: 
    m1 = r.match(l) 
    new=map(int,m1.group(2).split("-") 
    new[4]='RHUI5345JO' 

但我似乎无法匹配的字符串。

在此先感谢您的帮助。

+0

我已经修复并测试了它:现在就试试。 – 2010-06-11 16:29:44

+0

你在说我的一般情况下的正则表达式吗?我也修复了它。对不起,错误。 – 2010-06-14 13:24:46

回答

3

前瞻性替代?

你不能只是使用

for l in read_file: 
    l.replace("5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22", 
       "5EFF837F-EFC2-4c32-A3D4-RHUI5345JO") 
    # Write to file.. 

还是有更多的故事比你告诉我们吗?另外,除非它是一个太大的文件,否则我会建议将整个文件读入一个字符串中,并且为了提高速度而只做一个替换。

1

我觉得你的正则表达式关:

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 

应该是:

r = re.compile(r"(self\.uid\s*=\s*'5EFF837F-EFC2-4c32-A3D4-)([^']*)'") 

然后,当你有一个比赛,抢1组,并将其分配给一个变量和追加的更换字符串。

([^']*)组将搜索高达'标记的任何字符。这是你的目标移除组。

编辑:2010年6月11日@ 2:27 EST:贾斯汀皮尔有一个好点。你可以直接搜索并用这些数据替换。除非你正在寻找的8个字符的模式,其次是4,4,4,和12 ...在这种情况下,你可以使用该模式:你为什么要使用正则表达式这样的直

r = re.compile(r"self\.uid\s*=\s*('\w{8}-(:?\w{4}-){3})(\w{12})'") 
+0

我得到该解决方案的语法错误? – chrissygormley 2010-06-11 16:17:13

+0

感谢您的帮助,但我有一个额外的支架。我试图删除它,但我无法读取字符串。我可能已经在错误的地方去掉了支架。 – chrissygormley 2010-06-14 09:24:41

相关问题