在fileinput中使用正则表达式
我正在尝试使用正则表达式来替换另一个文件中存储的一个变量。我尝试的代码是:
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
str.replace(old, new[, count])
(old, new[, count]):
这个函数会返回一个新的字符串,把所有出现的 old 替换成 new。如果你提供了可选的参数 count,那么只会替换前面指定的次数。
re.match
的结果要么是 MatchObject
,要么(在你的情况下更可能)是 None
,这两者都不是 str.replace
所需要的字符串。
1
你需要使用 re.sub()
,而不是 str.replace()
:
re.sub(pattern, repl, string[, count])
这个函数会返回一个新字符串,它是通过把字符串
string
中最左边的、不重叠的pattern
替换成repl
得到的。如果找不到这个模式,string
就会原封不动地返回。repl
可以是一个字符串,也可以是一个函数;如果是字符串,里面的反斜杠转义字符会被处理。... 比如,像\6
这样的反向引用会被替换成模式中第六组匹配到的子字符串。...
除了上面提到的字符转义和反向引用,
\g<name>
会使用通过(?P<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'"
>>>
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),