首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:将字符串替换为prefixStringSuffix,保持原来的大小写,但在搜索匹配时忽略大小写

Python:将字符串替换为prefixStringSuffix,保持原来的大小写,但在搜索匹配时忽略大小写
EN

Stack Overflow用户
提问于 2009-05-04 03:26:39
回答 4查看 3.1K关注 0票数 2

所以我要做的就是在一个更大的字符串中用"<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“。

希望这已经足够清楚了。这似乎是一个简单的问题,但事实证明它比我想象的要难一点。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-04 04:01:02

这样可以吗?

代码语言:javascript
复制
>>> 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

票数 3
EN

Stack Overflow用户

发布于 2009-05-04 04:01:59

您应该能够使用单词边界断言\bre.sub中非常容易地做到这一点,它只在单词边界匹配:

代码语言:javascript
复制
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)

然后你就会得到:

代码语言:javascript
复制
>>> 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>.'

如果你对什么是“词边界”有更复杂的标准,你必须这样做:

代码语言:javascript
复制
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]组以匹配您认为是“非单词”的任何内容。

票数 0
EN

Stack Overflow用户

发布于 2009-05-04 04:06:50

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

代码语言:javascript
复制
import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/818691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档