python - 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
解决方案
您可以找到 1998 并使用带有re.sub的环视来断言之前(?<!\S)
和之后直接出现(?!\S)
的不是\S
非空白字符。
在更换使用 1999
(?<!\S)1998(?!\S)
您的代码中的行可能如下所示:
s = re.sub(r"(?<!\S)1998(?!\S)", "1999", s)
一个例子
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(?!\.)
推荐阅读
- css - 如何根据用户登录和注销加载样式
- reinforcement-learning - 简而言之,强化学习中的策略梯度算法中的目标网络是什么?
- java - maven 上的线程“main”java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 中的异常
- ios - SwiftUI 关闭导航项
- java - HTTP POST 方法说在 Android 上找不到 404 文件异常
- javascript - 在向 div 添加/删除背景图像时应用某种动画
- asp.net - 基于 IIS 的 Web 服务
- python - 如何使用具有大量文本文档的 Gensim/Word2Vec/Doc2Vec 进行监督学习?
- wifi - 我可以为 700 MHz Verizon 4G LTE 数据使用额定频率为 2.4 GHz 的抛物面天线吗?
- html5-video - 如何(或可能)将 AVC 编解码器配置文件和级别转换为 MIME 编解码器定义?