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
。