Python : String을 Prefixstringsuffix로 교체하여 원래 케이스를 유지하지만 경기를 검색 할 때 케이스를 무시합니다.

StackOverflow https://stackoverflow.com/questions/818691

문제

그래서 제가하려는 것은 문자열 "키워드"를 대체하는 것입니다. "<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"로 대체하고 싶지 않습니다.

그것이 충분히 분명해지기를 바랍니다. 단순한 문제처럼 보이지만, 나는 내가 생각했던 것보다 조금 더 어렵다는 것이 밝혀졌습니다.

도움이 되었습니까?

해결책

괜찮아?

>>> 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 플래그.

다른 팁

당신은 이것을 매우 쉽게 할 수 있어야합니다 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] 당신이 "비 단어"라고 생각하는 모든 것을 일치시키는 그룹.

최선의 해결책은 정규 표현이라고 생각합니다 ...

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

물론, 먼저 키워드 "정규 표현식 안전"을 만들어야합니다 (Regex 특수 문자 인용).

다음은 Nitpicking위원회의 제안이 있습니다. :-)

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

myString.replace('higher','hire')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top