Python:用re.sub替换列表中的多个特定单词

2024-05-23 13:41:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下字符串和列表“changewords”。我想用{word from list}替换{word from list}\n:'我不想替换'\n'的所有实例

string = "Foo \n value of something \n Bar \n Another value \n"
changewords = ["Foo", "Bar"]

期望输出:

'Foo: value of something \n Bar: Another value \n'

我试过以下方法

for i in changewords:
    tem = re.sub(f'{i} \n', f'{i}:', string)
tem
Output: 'Foo \n value of something \n Bar: Another value \n'

changewords2 = '|'.join(changewords)
tem = re.sub(f'{changewords2} \n', f'{changewords2}:', string)
tem
Output: 'Foo|Bar: \n value of something \n Foo|Bar: Another value \n'

如何获得所需的输出


Tags: offromreoutputstringfoovalueanother
3条回答

您完全可以不使用正则表达式,我的第一种方法是使用内置字符串函数.replace(),使其看起来像:

string = "Foo \n value of something \n Bar \n Another value \n"
changewords = ["Foo", "Bar"]

for word in changewords:
   to_replace = "{0} \n".format(word)
   replacement = "{0}:".format(word)
   string = string.replace(to_replace, replacement)

希望有帮助

使用替换字符串:

一种稍微优雅一点的方式。这一班轮:

re.sub(rf"({'|'.join(changewords)}) \n", r"\1:", string, flags=re.I)

演示:

>>> string = "Foo \n value of something \n Bar \n Another value \n"
>>> changewords = ['Foo', 'Bar', 'Baz', 'qux']
>>> 
>>> re.sub(rf"({'|'.join(changewords)}) \n", r"\1:", string, flags=re.I)
'Foo: value of something \n Bar: Another value \n'
>>> 

您可以使用flags选项指定不区分大小写的匹配。可以修改替换字符串,使其具有\1左右所需的任何内容,如冒号或逗号

值得注意的是,在Python中,可以在字符串上放置多个说明符。例如,您可以同时使用rf,比如rf"my raw formatted string"-说明符的顺序并不重要

re.sub(expr, repl, string)中的表达式中,可以指定组。分组是通过在文本周围放置括号()来完成的

然后,可以使用反斜杠及其出现次数在替换字符串repl中引用组-第一个组由\1引用

函数re.sub()将替换字符串中的\1与表达式参数中的第一个组(A|B|C)相关联

使用替换功能:

假设要用字典中的其他单词替换目标字符串中的单词。例如,您希望将“Bar”替换为“Hank”,将“Foo”替换为“Bernard”。这可以使用替换函数而不是替换字符串来完成:

>>> repl_dict = {'Foo':'Bernard', 'Bar':'Hank'}
>>> 
>>> expr = rf"({'|'.join(repl_dict.keys())}) \n"   # Becomes '(Foo|Bar) \\n'
>>>
>>> func = lambda mo: f"{repl_dict[mo.group(1)]}:"
>>> 
>>> re.sub(expr, func, string, flags=re.I)
'Bernard: value of something \n Hank: Another value \n'
>>> 

这可能是另一个一行,但为了清楚起见我把它拆开了

lambda函数的作用是获取传递给它的匹配对象mo,然后提取第一个组的文本。reg表达式中的第一个组是由()包围的文本,类似于(A|B|C)

替换函数使用mo.group(1)引用第一个组;类似地,在上一个示例中,替换字符串通过\1引用它

然后repl函数在dict中进行查找,并返回匹配的最终替换字符串

您可以使用以下代码:

import re

string = "Foo \n value of something \n Bar \n Another value \n"
changewords = ["foo", "Bar"]

tem = string
for i in changewords:
    tem = re.sub(f'(?i){i} \n', f'{i}:', tem)
print( tem )

输出:

foo: value of something
 Bar: Another value

注意tem = string初始化tem值,然后在for循环中使用re.subon tem并将返回结果赋给tem本身

(?i)用于忽略大小写匹配

Code Demo

相关问题 更多 >