Как проверить, существует ли точная строка в другой строке? - PullRequest
2 голосов
/ 22 октября 2010

У меня сейчас небольшая проблема.Я пытаюсь написать программу, которая будет выделять вхождения слова или фразы внутри другой строки, но только если строка, с которой сопоставляется, точно такая же.Часть, с которой я сталкиваюсь, заключается в определении того, содержится или нет подфраза, с которой я сопоставляю фразу, в другом большем подфразе.

Быстрый пример, показывающий эту проблему:

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> indicators_in_phrase = [indicator for indicator in indicators 
                            if indicator in phrase.lower()]
>>> print indicators_in_phrase
['therefore', 'for']

Я не хочу, чтобы 'for' был включен в этот список.Я знаю, почему он включен, но я не могу вспомнить ни одного выражения, которое могло бы отфильтровать такие подстроки.

Я заметил другие подобные вопросы на сайте, но каждый из них связан с решением Regex, котороеэто то, что я не чувствую себя комфортно, особенно не в Python.Есть ли какой-нибудь простой способ решить эту проблему без использования выражения Regex?Если нет, то будет очень полезно соответствующее выражение Regex и то, как оно может быть реализовано в приведенном выше примере.

Ответы [ 8 ]

5 голосов
/ 22 октября 2010

Существует способов сделать это без регулярных выражений, но большинство из этих способов настолько запутаны, что вы захотите потратить время на изучение простой последовательности регулярных выражений, которая вам нужна.

2 голосов
/ 22 октября 2010

регулярное выражение - самый простой способ! Подсказка:

re.compile(r'\btherefore\b')

Тогда вы можете изменить слово в середине!

РЕДАКТИРОВАТЬ: Я написал это для вас:

import re

indicators = ["therefore", "for", "since"]

phrase = "... therefore, I conclude I am awesome. "

def find(phrase, indicators):
    def _match(i):
        return re.compile(r'\b%s\b' % (i)).search(phrase)
    return [ind for ind in indicators if _match(ind)]

>>> find(phrase, indicators)
['therefore']
2 голосов
/ 22 октября 2010

Это одна строка с регулярным выражением ...

import re

indicators = ["therefore", "for", "since"]
phrase = "... therefore, I conclude I am awesome."

indicators_in_phrase = set(re.findall(r'\b(%s)\b' % '|'.join(indicators), phrase.lower()))
1 голос
/ 22 октября 2010
  1. Создать набор показателей
  2. Создать набор фраз
  3. Найти пересечение

Код:

indicators = ["therefore", "for", "since"]
phrase = "... therefore, I conclude I am awesome."
print list(set(indicators).intersection(set( [ each.strip('.,') for each in phrase.split(' ')])))

Приветствия:)

1 голос
/ 22 октября 2010

Я думаю, что вы пытаетесь сделать что-то похожее на это:

import string

words_in_phrase = string.split(phrase)

Теперь у вас в списке появятся слова:

['...', 'therefore,', 'I', 'conclude', 'I', 'am', 'awesome.']

Затем сравнитесписки примерно так:

indicators_in_phrase = []
for word in words_in_phrase:
  if word in indicators:
    indicators_in_phrase.append(word)

Возможно, есть несколько способов сделать это менее многословным, но я предпочитаю ясность.Кроме того, вам, возможно, придется подумать об удалении знаков препинания, как в «потрясающем».и "следовательно"

Для этого используйте rstrip, как в другом ответе

0 голосов
/ 22 октября 2010

Вы можете удалить знаки препинания из своей фразы, а затем разделить ее так, чтобы все слова были индивидуальными.Тогда вы можете сделать сравнение строк

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> ''.join([ i for i in phrase.lower() if i not in string.punctuation]).strip().split()
['therefore', 'I', 'conclude', 'I', 'am', 'awesome']
>>> p = ''.join([ i for i in phrase.lower() if i not in string.punctuation]).strip().split()
>>> indicators_in_phrase = [indicator for indicator in indicators if indicator in p ]
>>> indicators_in_phrase
['therefore']
0 голосов
/ 22 октября 2010

Проблема с "для" в том, что он внутри "поэтому" или что это не слово? Например, если один из ваших индикаторов был «благоговением», вы бы хотели, чтобы он был включен в показатели

Как бы вы хотели разрешить следующую ситуацию? показатели = ["abc", "cde"] фраза = "Один или два"

0 голосов
/ 22 октября 2010

Немного длинно, но дает представление / конечно, есть регулярное выражение, чтобы сделать его простым

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> phrase_list = phrase.split()
>>> phrase_list
['...', 'therefore,', 'I', 'conclude', 'I', 'am', 'awesome.']
>>> phrase_list = [ k.rstrip(',') for k in phrase_list]
>>> indicators_in_phrase = [indicator for indicator in indicators if indicator in phrase_list]
>>> indicators_in_phrase 
['therefore']
...