所以我要做的就是在一个更大的字符串中用"<b>keyword</b>"替换一个字符串"keyword“。
示例:
myString =“您好。您应该提升该人员的职位。您好。”
keyword = "hi“
我想要的结果是:
result = "<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>."
在用户键入关键字之前,我不知道关键字是什么,在运行查询之前,我不知道语料库(myString)。
我找到了一个解决方案,它在大多数情况下都有效,但有一些误报,namely it would return "<b>hi<b/>gher"不是我想要的。还要注意,我试图保留原始文本的大小写,并且匹配应该发生在不区分大小写的情况下。因此,如果关键字是"hi“,它应该替换HI with <b>HI</b> and hi with <b>hi</b>.
我最近使用的是它的一个稍微派生的版本:http://code.activestate.com/recipes/576715/,但我仍然不知道如何对字符串进行第二次传递,以修复上面提到的所有误报。
或者使用NLTK的WordPunctTokenizer (它简化了标点符号等一些事情),但我不确定如何将句子重新组合在一起,因为它没有反向功能,我想保留myString的原始标点符号。重要的是,对所有标记进行连接不会返回原始字符串。例如,如果原始文本有"7-7“,则在将标记重新分组为其原始文本时,我不希望将"7 - 7”替换为"7 - 7“。
希望这已经足够清楚了。这似乎是一个简单的问题,但事实证明它比我想象的要难一点。
发布于 2009-05-04 04:01:02
这样可以吗?
>>> import re
>>> myString = "HI there. You should higher that person for the job. Hi hi."
>>> keyword = "hi"
>>> search = re.compile(r'\b(%s)\b' % keyword, re.I)
>>> search.sub('<b>\\1</b>', myString)
'<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>.'整个过程的关键是使用word boundaries、groups和re.I flag。
发布于 2009-05-04 04:01:59
您应该能够使用单词边界断言\b在re.sub中非常容易地做到这一点,它只在单词边界匹配:
import re
def SurroundWith(text, keyword, before, after):
regex = re.compile(r'\b%s\b' % keyword, re.IGNORECASE)
return regex.sub(r'%s\0%s' % (before, after), text)然后你就会得到:
>>> SurroundWith('HI there. You should hire that person for the job. '
... 'Hi hi.', 'hi', '<b>', '</b>')
'<b>HI</b> there. You should hire that person for the job. <b>Hi</b> <b>hi</b>.'如果你对什么是“词边界”有更复杂的标准,你必须这样做:
def SurroundWith2(text, keyword, before, after):
regex = re.compile(r'([^a-zA-Z0-9])(%s)([^a-zA-Z0-9])' % keyword,
re.IGNORECASE)
return regex.sub(r'\1%s\2%s\3' % (before, after), text)您可以修改[^a-zA-Z0-9]组以匹配您认为是“非单词”的任何内容。
发布于 2009-05-04 04:06:50
我认为最好的解决方案是正则表达式...
import re
def reg(keyword, myString) :
regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
return regx.sub(r'<b>\1</b>', myString)当然,您必须首先使您的关键字“正则表达式安全”(引用任何正则表达式特殊字符)。
https://stackoverflow.com/questions/818691
复制相似问题