Я запускаю 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 ')
(пробел на обоих концах). Но оба эти изменения не изменили никаких слов, даже исходного (единственного) «мужчина».
Итак, как мне изменить экземпляр «Он был хорошим человеком — истинным гуманистом» на «Он был хорошим джентльменом — истинным гуманистом», не превращая его в гипергантитаризм?
Вам нужны появления слова «человек», но только сами по себе — другими словами, только если ему не предшествуют и не следуют другие буквы или символы, которые были бы частью слова.
Я не знаю, содержит ли маратхи такие символы, как «-», которые могут быть частью слова, например, «Он был настоящим мужчиной-ребенком», и в этом случае вы можете или не хотите заменять его.
На английском языке, поскольку вы используете регулярное выражение, вы можете сделать это:
'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». Я записал регулярное выражение. Большое спасибо еще раз.
Не за что. Если вы считаете, что это отвечает на ваш вопрос, установите флажок рядом с ответом, чтобы вопрос больше не оставался без ответа.
Почему бы вам не попробовать это - превратить (мужчину) в джентльмена. Затем запустите другой код и замените все (hugents) на (человеческое) простое исправление.
Привет. Спасибо за решение, но это было бы невозможно вообще. Возможные изменения будут огромными. человек, женщина, гуманитарий, спортсмен, спортивное мастерство приходят мне на ум. Изменить все эти десятки вхождений во всех статьях википедии на какую-то тарабарщину было бы огромной проблемой, а затем найти их и изменить обратно было бы огромной проблемой. Это также было бы злоупотреблением ресурсами сервера. И после того, как все будет сделано, это будет разрушительным редактированием с нетехнической точки зрения. Конечным результатом будет отзыв доступа/авторизации моего бота.
Я не уверен, как pywikibot манипулирует строкой, но, возможно, попробуйте использовать \s вместо пробела.
('\sman\s', '\sgent\s')