使用带有fileinput的正则表达式

时间:2010-06-15 09:04:25

标签: python regex

我正在尝试使用正则表达式替换存储在另一个文件中的变量。我试过的代码是:

r = re.compile(r"self\.uid\s*=\s*('\w{12})'")
for line in fileinput.input(['file.py'], inplace=True): 
    print line.replace(r.match(line), sys.argv[1]), 

文件中变量的格式为:

self.uid = '027FC8EBC2D1'

我正在尝试传入这种格式的参数,并使用正则表达式来验证sys.argv[1]格式是否正确,并找到存储在此文件中的变量并将其替换为新变量。

任何人都可以提供帮助。谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

您可以使用与正则表达式匹配的re.sub并一次性执行替换:

r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'")
for line in fileinput.input(['file.py'], inplace=True):
    print r.sub(r"\1'%s'" %sys.argv[1],line),

答案 1 :(得分:1)

您需要使用re.sub(),而不是str.replace()

  

re.sub(pattern, repl, string[, count])

     

返回通过替换pattern替换stringrepl的最左边非重叠事件而获得的字符串。如果未找到模式,则string将保持不变。 repl可以是字符串或函数;如果它是一个字符串,则处理其中的任何反斜杠转义。 ... \6等反向引用将替换为模式中group 6匹配的子字符串。

     

...

     

除了如上所述的字符转义和反向引用外,\g<name>还将使用由(?P<name>...)语法定义的名为name的组匹配的子字符串。 \g<number>使用相应的组号;

快速测试,使用\g<number>进行反向引用:

>>> r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'")
>>> line = "self.uid = '027FC8EBC2D1'"
>>> newv = "AAAABBBBCCCC"
>>> r.sub(r"\g<1>'%s'" % newv, line)
"self.uid = 'AAAABBBBCCCC'"
>>> 

答案 2 :(得分:0)

str.replace(old, new[, count])(旧的,新的[,计数]):

  

返回字符串的副本,其中所有出现的子字符串 old 都替换为 new 。如果给出了可选参数 count ,则只替换第一次计数。

re.match会返回MatchObject或(最有可能)Nonestr.replace也不需要字符串。