在fileinput中使用正则表达式

4 投票
3 回答
4452 浏览
提问于 2025-04-15 23:59

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

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),

撰写回答