Python:将字符串替换为前缀stringsuffix,保留原始大小写,但在搜索匹配项时忽略大小写

Python:将字符串替换为前缀stringsuffix,保留原始大小写,但在搜索匹配项时忽略大小写,python,regex,search,replace,nltk,Python,Regex,Search,Replace,Nltk,所以我要做的是用 “关键字” 在一个更大的字符串 例如: myString=“你好。你应该让那个人更适合这份工作。你好。” 关键字=“嗨” 我想要的结果是: result=“你好。你应该让那个人更适合这份工作。 Hi-Hi。” 我将不知道什么关键字,直到用户键入关键字 并且在查询运行之前不会知道语料库(myString) 我找到了一个大部分时间都有效的解决方案,但有一些误报, 即它将返回“更高”,这不是我想要的。还请注意,我 我试图保留原始文本的大小写,匹配应该是 不分情况放置。因此,如果关键字

所以我要做的是用
“关键字”
在一个更大的字符串

例如:

myString=“你好。你应该让那个人更适合这份工作。你好。”

关键字=“嗨”

我想要的结果是:

result=“你好。你应该让那个人更适合这份工作。
Hi-Hi。”

我将不知道什么关键字,直到用户键入关键字 并且在查询运行之前不会知道语料库(myString)

我找到了一个大部分时间都有效的解决方案,但有一些误报,
即它将返回“更高”
,这不是我想要的。还请注意,我 我试图保留原始文本的大小写,匹配应该是 不分情况放置。因此,如果关键字为“hi”,则应替换为
HI带HI和HI带HI。

我最近的一次尝试是使用了这个稍微衍生的版本: 但我仍然不知道如何进行第二次字符串传递来修复上面提到的所有误报

或者使用NLTK的WordSpuntTokenizer(简化了标点符号之类的事情) 但我不知道我该如何把这些句子重新组合起来,因为事实并非如此 有一个反向函数,我想保留myString的原始标点符号。重要的是,连接所有标记不会返回原始标记 一串例如,如果原始文本中有“7-7”,那么在将令牌重新组合为原始文本时,我不想将“7-7”替换为“7-7”

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

这个可以吗

>>> 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>.'
>>重新导入
>>>myString=“你好。你应该让那个人更适合这份工作。你好。”
>>>关键字=“嗨”
>>>search=re.compile(r'\b(%s)\b'%关键字,re.I)
>>>search.sub('\\1',myString)
“你好。你应该让那个人担任这项工作。嗨,嗨

整个过程的关键是使用,.

您应该能够使用
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>.'

您可以修改<代码> [^ a-Za-Z09] < /Cord>组,以匹配任何您认为“非Word”的内容:

< p>我认为最好的解决方案是正则表达式…

import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)
重新导入
def reg(关键字,myString):
regx=re.compile(r'\b('+关键字+r')\b',re.IGNORECASE)
返回regx.sub(r'\1',myString)

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

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


看起来可能是重复?这是相似的,但有更多的要求,然后简单地做一个不区分大小写的字符串替换。这正是我想要的。我可能需要编辑Dave B所说的构成单词边界的内容,但这应该很容易编辑,而且我必须查看数据并在以后找出答案(如果需要的话)。否则,这正是我所需要的,我肯定涵盖了我能想到的所有案例。谢谢。我在这里运行before=''after=''text=“您好。您应该让那个人担任该职务。HI-HI.”关键字='HI'print'result=',SurroundWith(text,keyword,before,after)并获得结果=
import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)
myString = "HI there. You should higher that person for the job. Hi hi."

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