2014-05-14 611 views
0

可以有一个输入"some word"替换多个单词 - python

我想其中包含此输入

我试图用这个代码的一些其它文本"<strong>some</strong> <strong>word</strong>"替换此输入:

input = "some word".split() 
pattern = re.compile('(%s)' % input, re.IGNORECASE) 
result = pattern.sub(r'<strong>\1</strong>',text) 

却是失败,我知道为什么:我想知道如何将列表input的所有元素传递给compile(),以便(%s)可以捕获它们中的每一个。

感谢所有帮助

+0

你不应该使用'input'变量名 - 这是一个内置的功能... – Roberto

+0

@Roberto肯定,做到了对这里的了解;)谢谢,虽然 – doniyor

+0

噢,对不起啦:) – Roberto

回答

2

正确的方法,因为你已经分裂名单,是直接围绕该列表中的每一项(从来没有使用正则表达式的话):

sterm = "some word".split() 
result = " ".join("<strong>%s</strong>" % w for w in sterm) 

如果你是想知道,你正在寻找的模式是:

pattern = re.compile('(%s)' % '|'.join(sterm), re.IGNORECASE) 

这适用于你的字符串,因为正则表达式将成为

(some|word) 

这意味着“匹配some或匹配word”。

但是,这不是一个好方法,因为它不适用于所有字符串。例如,考虑一个字包含另一种情况下,如

a banana and an apple 

成为:

<strong>a</strong> <strong>banana</strong> <strong>a</strong>nd <strong>a</strong>n <strong>a</strong>pple 
+0

感谢大卫。非常好,不知道。蟒蛇多酷! – doniyor

1

它看起来像你想搜索多个单词 - 这个词这个词。这意味着你需要通过分离您的搜索|,像下面的脚本:

import re 

text = "some word many other words" 
input = '|'.join('some word'.split()) 
pattern = re.compile('(%s)' % input, flags=0) 
print pattern.sub(r'<strong>\1</strong>',text) 
+0

谢谢杰伊姆,美丽! – doniyor

1

我不能完全肯定,如果我知道你要问什么,但如果你想通过输入的所有元素作为在编译函数调用中的参数,你可以使用*输入代替输入。 *会将列表拆分为其元素。作为一种替代方案,你不能试着加入的列表,并在开始时加入,最后加入

1

或者,您可以使用连接运算符与列表理解来创建预期的结果。

text = "some word many other words".split() 
result = ' '.join(['<strong>'+i+'</strong>' for i in text])