我正在尝试使用正则表达式替换存储在另一个文件中的变量。我试过的代码是:
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]
格式是否正确,并找到存储在此文件中的变量并将其替换为新变量。
任何人都可以提供帮助。谢谢你的帮助。
答案 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
替换string
中repl
的最左边非重叠事件而获得的字符串。如果未找到模式,则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
或(最有可能)None
,str.replace
也不需要字符串。