字符串
txt = "this is a red house"
已经存在。然后有一个列表
patterns = ["thi", "a r", "use"]
有一些匹配。
计划是使用a = re.sub("".join(patterns), "".join(patterns) + "^", txt)
,我希望它会返回,因为 thi ^ s是一个房子^ 。不是那么多 - 它只是再次打印字符串。如果使用的是re.search
,它实际上会返回None
,因此原因是re.sub
找不到任何内容,只返回字符串。
我已经准备好了解这个问题,认为re.sub
不能按我想象的方式使用,然后我不小心在一个简单的循环中尝试了它:
for i in patterns:
a = re.sub(i, i + "^", txt)
print(a)
突然间(几乎)工作了: 这是一个红房子 [\ n] 这是一个房子 em> [\ n] 这是一个红屋^ 。现在我不能放手。发生了什么事?
答案 0 :(得分:2)
如果将a
替换为txt
:
for i in patterns:
txt = re.sub(i, i + "^", txt)
print(txt)
这样,您实际上会逐步修改文本,而不是对原始文本执行每次替换并丢弃结果:
this is a red house
thi^s is a red house
thi^s is a r^ed house
thi^s is a r^ed house^
由于您并未在re.sub()
中使用正则表达式,因此更容易使用str.replace
:
for pattern in patterns:
txt = txt.replace(pattern, pattern + '^')
如果您确实想使用正则表达式,则必须执行以下操作:
patterns_regex = '(' + '|'.join(patterns) + ')' # ['a', 'b'] -> '(a|b)'
print(re.sub(patterns_regex, r'\1^', txt)
答案 1 :(得分:2)
这会为您提供您正在寻找的结果:
txt = "this is a red house"
patterns = ["thi", "a r", "use"]
for s in patterns:
txt = re.sub(s,s+'^',txt)
print(txt)
首先,你的print语句在循环中,因此是重复的字符串。
其次,您的 re.sub(...)会在每次循环中将更改返回到' txt' 。如果您希望累积您需要将结果分配回' txt' 。否则,您只会看到分配给' a' 的最新替代。
第三,"" .join(模式)会产生一个字符串" thia ruse" ' txt' 。
的一部分我希望这会有所帮助。正则表达式本身就是纪律。自80年代以来我一直在使用它们,但仍需要查看文档。继续!
答案 2 :(得分:1)
将您的模式与|
一起加入,然后使用函数作为re.sub()
的替换参数:
regex = re.compile("|".join([f"({p})" for p in patterns]))
regex.sub(lambda m: m.string[m.start():m.end()]+"^", txt)
# 'thi^s is a r^ed house^'
注意:如果您不想使用re.compile()
,可以在以下一行中完成所有操作:
re.sub("|".join([f"({p})" for p in patterns]),
lambda m: m.string[m.start():m.end()]+"^",
txt)
答案 3 :(得分:1)
您没有在for
循环的每次迭代中保存替换。尝试将替换值重新分配回txt
。
import re
txt = "this is a red house"
patterns = ["thi", "a r", "use"]
for i in patterns:
txt = re.sub(i, i + "^", txt)
print(txt)
# prints:
thi^s is a r^ed house^