Python:string&;关于子比较的列表

Python:string&;关于子比较的列表,python,regex,Python,Regex,弦 txt = "this is a red house" 已经存在了。然后是一个列表 patterns = ["thi", "a r", "use"] 有一些火柴 计划是使用a=re.sub(“.join(patterns)”,“.join(patterns)+“^”,txt),我希望它能以的形式返回,这是一个r^ed house^。没有那么多–它只是再次打印字符串。如果改用re.search,它实际上返回None,因此原因是re.sub没有找到任何内容,只返回字符串 我准备拔掉这个插头,

txt = "this is a red house"
已经存在了。然后是一个列表

patterns = ["thi", "a r", "use"]
有一些火柴

计划是使用
a=re.sub(“.join(patterns)”,“.join(patterns)+“^”,txt)
,我希望它能以的形式返回,这是一个r^ed house^。没有那么多–它只是再次打印字符串。如果改用
re.search
,它实际上返回
None
,因此原因是
re.sub
没有找到任何内容,只返回字符串

我准备拔掉这个插头,认为
re.sub
不能像我想象的那样使用,然后我不小心在一个简单的循环中尝试了它:

for i in patterns:
    a = re.sub(i, i + "^", txt)
    print(a)

突然它(几乎)起了作用:这是一座红色的房子[\n]这是一座红色的房子[\n]这是一座红色的房子^。现在我不能让它过去。发生了什么?

将您的模式与
|
连接在一起,然后使用函数作为
re.sub()的替换参数

注意:如果您不想使用
re.compile()
,可以在一行中使用:

re.sub("|".join([f"({p})" for p in patterns]), 
       lambda m: m.string[m.start():m.end()]+"^", 
       txt)

将您的模式与
|
连接在一起,然后使用一个函数作为
re.sub()
的替换参数:

注意:如果您不想使用
re.compile()
,可以在一行中使用:

re.sub("|".join([f"({p})" for p in patterns]), 
       lambda m: m.string[m.start():m.end()]+"^", 
       txt)

您没有在
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^

您没有在
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^

如果将
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)

如果将
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)

这将为您提供所需的结果:

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(patterns)生成一个字符串“thia-ruse”,该字符串与“txt”的任何部分都不匹配


我希望这有帮助。正则表达式本身就是一门学科。我从80年代开始使用它们,现在还需要检查文档。继续走

这将为您提供所需的结果:

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(patterns)生成一个字符串“thia-ruse”,该字符串与“txt”的任何部分都不匹配


我希望这有帮助。正则表达式本身就是一门学科。我从80年代开始使用它们,现在还需要检查文档。继续走

你的问题到底是什么?在动态构建一个工作正则表达式之前,我首先要弄清楚它应该是什么样子。调用
re.sub
生成原始输入,因为构造的正则表达式与任何内容都不匹配,所以没有任何内容被替换。你看,这就是我的想法。然后它在循环中匹配。如果构造的正则表达式与任何东西都不匹配,为什么它会在那里工作?因为在您对
re.sub
的第一次调用中,您的正则表达式是
thia-ruse
。在循环中的其他调用中,查找
thi
a r
,然后使用
use
。您的问题到底是什么?在动态构建一个工作正则表达式之前,我首先要弄清楚它应该是什么样子。调用
re.sub
生成原始输入,因为构造的正则表达式与任何内容都不匹配,所以没有任何内容被替换。你看,这就是我的想法。然后它在循环中匹配。如果构造的正则表达式与任何东西都不匹配,为什么它会在那里工作?因为在您对
re.sub
的第一次调用中,您的正则表达式是
thia-ruse
。在循环中的其他调用中,查找
thi
ar
,然后使用
use