Как добавить условие if в re.sub в python - PullRequest
0 голосов
/ 30 января 2019

Я использую следующий код для замены строк в words на words[0] в заданном sentences.

import re
sentences = ['industrial text minings', 'i love advanced data minings and text mining']

words = ["data mining", "advanced data mining", "data minings", "text mining"]


start_terms = sorted(words, key=lambda x: len(x), reverse=True)
start_re = "|".join(re.escape(item) for item in start_terms)

results = []

    for sentence in sentences:
    for terms in words:
        if terms in sentence:
            result = re.sub(start_re, words[0], sentence)
            results.append(result)
            break

print(results)

Мой ожидаемый результат выглядит следующим образом:

[industrial text minings', 'i love data mining and data mining]

Тем не менее, я получаю следующее:

[industrial data minings', 'i love data mining and data mining]

В первом предложении text minings нет в words.Тем не менее, он содержит «интеллектуальный анализ текста» в списке слов, поэтому условие «интеллектуальный анализ текста» в «промышленные текстовые анализ» становится TrueЗатем, после замены, «извлечение текста» становится «извлечением данных», где символ «s» остается на том же месте.Я хочу избежать таких ситуаций.

Поэтому мне интересно, есть ли способ использовать условие if в re.sub, чтобы увидеть, является ли следующий символ пробелом или нет.Если пробел, сделайте замену, иначе не делайте этого.

Я также доволен другими решениями, которые могут решить мою проблему.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я немного изменил ваш код:

# Using Python 3.6.1
import re
sentences = ['industrial text minings and data minings and data', 'i love advanced data mining and text mining as data mining has become a trend']
words = ["data mining", "advanced data mining", "data minings", "text mining", "data", 'text']

# Sort by length
start_terms = sorted(words, key=len, reverse=True)

results = []

# Loop through sentences
for sentence in sentences:
    # Loop through sorted words to replace
    result = sentence
    for term in start_terms:
        # Use exact word matching
        exact_regex = r'\b' + re.escape(term) + r'\b'
        # Replace matches with blank space (to avoid priority conflicts)
        result = re.sub(exact_regex, " ", result)
    # Replace inserted blank spaces with "data mining"
    blank_regex = r'^\s(?=\s)|(?<=\s)\s$|(?<=\s)\s(?=\s)'
    result = re.sub(blank_regex, words[0] , result)
    results.append(result)
# Print sentences
print(results)

Вывод:

['industrial data mining minings and data mining and data mining', 'i love data mining and data mining as data mining has become a trend']

Регулярное выражение может быть немного запутанным, поэтому вот быстрый разбив:

\bword\b соответствует точным фразам / словам, поскольку \b является границей слова (подробнее об этом здесь )

^\s(?=\s) соответствует пробелу в начале, за которым следует другой пробел.

(?<=\s)\s$ соответствует пробелу в конце, которому предшествует другой пробел.

(?<=\s)\s(?=\s) соответствует пробелу с пробелом с обеих сторон.

Для получения дополнительной информации о положительном взгляде за спиной (?<=...) и позитивный взгляд в будущее (?=...) см. это руководство по Regex .

0 голосов
/ 30 января 2019

Вы можете использовать границу слова \b, чтобы окружить все ваше регулярное выражение:

start_re = "\\b(?:" + "|".join(re.escape(item) for item in start_terms) + ")\\b"

Ваше регулярное выражение станет чем-то вроде:

\b(?:data mining|advanced data mining|data minings|text mining)\b

(?:) обозначает негруппа захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...