Как добавить пробел в строку поиска/поиска python?

Я запускаю pywikibot в википедии маратхи уже почти месяц. Единственная задача этого бота — найти и заменить. Вы можете найти общую информацию о pywikibot по адресу: pywikibot. Вы можете найти подробности этой конкретной операции поиска и замены в заменить.py и fixes.py, а также дополнительные примеры исправлений здесь.

Ниже приведена часть моего исходного кода. При запуске бота в википедии маратхи я столкнулся с трудностью из-за сценария на языке маратхи. Все замены идут нормально, но одна нет. Например, я буду использовать английские слова вместо маратхи.

Первая часть («исправление») следующего кода ищет «{{PAGENAME}}» и заменяет его на «{{subst:PAGENAME}}». Параметр msg представляет собой сводку редактирования.

Второе исправление кода «man» находит «man» и заменяет его на «gent». Но проблема в том, что он также заменяет «человек» на «огромный», «мастерство» на «мастерство» и так далее.

fixes = {
    'name': {
        'regex': True,
        'nocase': True,
        'msg': {'mr': '{{PAGENAME}} → पानाचे मूळ नाव (base name of page)'},
        'replacements': [
            ( r'{{ *PAGENAME *}}', '{{subst:PAGENAME}}' ),
        ],
    },
    'man': {
        'regex': True,
        'msg': {'mr': 'man → gent'},
        'replacements': [
            ('man', 'gent'),
        ],
    },
}

Поэтому я попытался обновить параметр поиска и замены с ('man', 'gent') на ('man ', 'gent ') (пробел в конце), а затем на (' man ', ' gent ') (пробел на обоих концах). Но оба эти изменения не изменили никаких слов, даже исходного (единственного) «мужчина».

Итак, как мне изменить экземпляр «Он был хорошим человеком — истинным гуманистом» на «Он был хорошим джентльменом — истинным гуманистом», не превращая его в гипергантитаризм?

Я не уверен, как pywikibot манипулирует строкой, но, возможно, попробуйте использовать \s вместо пробела. ('\sman\s', '\sgent\s')

M B 04.04.2022 06:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Я не знаю, содержит ли маратхи такие символы, как «-», которые могут быть частью слова, например, «Он был настоящим мужчиной-ребенком», и в этом случае вы можете или не хотите заменять его.

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

'man': {
        'regex': True,
        'msg': {'mr': 'man → gent'},
        'replacements': [
            ('(?<=[^\w]|^)man(?=[^\w]|$)', 'gent'),
        ],
}

Регулярное выражение '(?<=[^\w]|^)man(?=[^\w]|$)' означает:

  • буквальное слово «мужчина»
  • которому предшествует любой символ, который не является символом слова [^\w] или началом строки ^
  • за которым следует любой символ, не являющийся символом слова [^\w], или конец строки $

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

Если ваш движок регулярных выражений не считает символы, составляющие слова маратхи, частью \w, вы можете заменить их строкой всех символов, составляющих язык, если это достижимо (в отличие от логографических языков, таких как Китайский).

Обратите внимание, что при тестировании регулярного выражения в некоторых средах ему нужны эти |^ и |$, а в других это может вызвать проблемы.

В чистом Python это работает:

import re

text = 'He was a good man, a true humanitarian.'
print(re.sub('(?<=[^\w])man(?=[^\w])', 'gent', text))

text = 'तो एक चांगला माणूस होता माणूसला'
print(re.sub('(?<=[^\w])माणूस(?=[^\w])', 'व्यक्ती', text))

Выход:

He was a good gent, a true humanitarian.
तो एक चांगला व्यक्ती होता माणूसला

Так что (?<=[^\w])man(?=[^\w]) может быть все, что вам нужно. (Надеюсь, маратхи здесь случайно не грубый - я виню Google Translate)

Большое спасибо, я не пробовал, но думаю, что это сработает. Я узнал причину того, что мой код не работает. Прежде чем запускать обновленный код в реальных статьях, я экспериментировал с ним в своей песочнице. Синтаксис man работал правильно, но в моей песочнице одно вхождение было со ссылкой на статью man, а другое было голым, но в конце строки, без точки и без пробела. Эти проблемы могут быть решены в самих статьях с синтаксисом «man». Я записал регулярное выражение. Большое спасибо еще раз.

usernamekiran 04.04.2022 11:36

Не за что. Если вы считаете, что это отвечает на ваш вопрос, установите флажок рядом с ответом, чтобы вопрос больше не оставался без ответа.

Grismar 04.04.2022 12:35

Почему бы вам не попробовать это - превратить (мужчину) в джентльмена. Затем запустите другой код и замените все (hugents) на (человеческое) простое исправление.

Привет. Спасибо за решение, но это было бы невозможно вообще. Возможные изменения будут огромными. человек, женщина, гуманитарий, спортсмен, спортивное мастерство приходят мне на ум. Изменить все эти десятки вхождений во всех статьях википедии на какую-то тарабарщину было бы огромной проблемой, а затем найти их и изменить обратно было бы огромной проблемой. Это также было бы злоупотреблением ресурсами сервера. И после того, как все будет сделано, это будет разрушительным редактированием с нетехнической точки зрения. Конечным результатом будет отзыв доступа/авторизации моего бота.

usernamekiran 04.04.2022 11:45

Другие вопросы по теме