Python:用prefixStringSuffix替换字符串保留原始大小写,但在搜索匹配时忽略大小写

时间:2009-05-04 03:26:39

标签: python regex search replace nltk

所以我要做的就是用字符串“keyword”替换     "<b>keyword</b>" 在更大的字符串中。

示例:

myString =“HI那里。你应该为那份工作做得更高。你好。”

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

希望足够清楚。看起来像一个简单的问题,但它的结果比我想象的要困难一些。

4 个答案:

答案 0 :(得分: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>.'

整个事情的关键是使用word boundariesgroupsre.I flag

答案 1 :(得分:0)

你应该可以使用re.sub使用单词boundary assertion \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]群组以匹配您认为是“非词汇”的任何内容。

答案 2 :(得分: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)

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

答案 3 :(得分:-1)

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

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

myString.replace('higher','hire')