2

所以我想要做的是用 "<b>keyword</b>" 一个更大的字符串替换一个字符串“关键字”。

例子:

myString = "你好。你应该提高那个人的职位。你好,你好。"

关键字=“嗨”

我想要的结果是:

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”。

希望这已经足够清楚了。似乎是一个简单的问题,但结果却比我想象的要困难一些。

4

4 回答 4

3

这行吗?

>>> 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>.'

整个事情的关键是使用单词边界re.I 标志

于 2009-05-04T04:01:01.613 回答
0

您应该能够re.sub使用单词边界断言非常轻松地做到这一点\b,它只匹配单词边界:

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-04T04:01:59.257 回答
0

我认为最好的解决方案是正则表达式......

import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)

当然,您必须首先使您的关键字“正则表达式安全”(引用任何正则表达式特殊字符)。

于 2009-05-04T04:06:50.260 回答
-1

这是来自挑剔委员会的一个建议。:-)

myString = "HI there. You should higher that person for the job. Hi hi."

myString.replace('higher','hire')
于 2009-07-20T19:08:31.517 回答