首页 > 解决方案 > Python,正则表达式:查找并替换“yyyy”的所有实例,除非在句点前面

问题描述

我试图找到一个数字字符串并替换它。例如,假设“1998”,在当前目录中的所有文件中将其替换为“1999”。但是,我不想对看起来像“1998”的字符串进行这种替换。(即1998.csv, 1998.png,1998.xlsx等)。我该怎么做呢?我查阅了文档replace(),它没有正则表达式的选项。

inputDir = "."
outputDir = "./test"
find = "1998"
replace = "1999" 

for path, dirs, files in os.walk(os.path.abspath(inputDir)): 
        for filename in fnmatch.filter(files, filePattern):
            filepath = os.path.join(path, filename)
        with open(filepath) as f:
            s = f.read()
            s = s.replace(find, replace) # second, update all years

标签: pythonregex

解决方案


您可以找到 1998 并使用带有re.sub的环视来断言之前(?<!\S)和之后直接出现(?!\S)的不是\S非空白字符。

在更换使用 1999

(?<!\S)1998(?!\S)

您的代码中的行可能如下所示:

s = re.sub(r"(?<!\S)1998(?!\S)", "1999", s)

正则表达式演示| Python 演示

一个例子

import re
regex = r"(?<!\S)1998(?!\S)"
test_str = ("this is 1998\n"
    "1998.csv 1998.png, 1998.xlsx")

result = re.sub(regex, "1999", test_str)

if result:
    print (result)

结果

this is 1999
1998.csv 1998.png, 1998.xlsx 1999

如果后面的内容不能只是一个点,另一种选择是使用负前瞻并以单词边界开始 1998:

\b1998(?!\.)

推荐阅读