搜索String并将其替换为变量

时间:2010-06-11 16:05:04

标签: python regex

我正在尝试使用正则表达式搜索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'

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

为什么使用正则表达式进行这种直接替换?

你能不能只使用

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

还是故事还有比你告诉我们更多的东西?此外,除非它是一个太大的文件,我建议将整个文件读成一个字符串,并为了速度只做一个替换。

答案 1 :(得分: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: Justin Peel有一个好点。您可以直接搜索并替换此数据。除非您正在寻找8个字符的模式,然后是4个,4个,4个和12个...在这种情况下您可以使用该模式:

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