Python:string& list re.sub比较

时间:2017-11-06 02:16:15

标签: python regex

字符串

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] 这是一个红屋^ 。现在我不能放手。发生了什么事?

4 个答案:

答案 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^