我在马拉地维基百科上运行pywikibot已经快一个月了。这个机器人的唯一任务是查找和替换。您可以在以下位置找到pywikibot的总体详细信息:pywikibot。您可以在replace.py和fixes.py中找到特定查找和替换操作的详细信息,甚至可以在此处找到更多的修复示例。
以下是我的源代码的一部分。在马拉地维基百科上运行机器人时,由于马拉地语的脚本,我面临着一个困难。所有的替代品都很好,但有一个不是。例如,我会用英语单词代替马拉地语。
以下代码的第一部分("修复"(搜索"修复";{{PAGENAME}}";,并将其替换为";{{subst:PAGENAME}}";。msg参数是编辑摘要。
代码的第二个固定";人";,发现";人;并将其替换为";代理";。但问题是,它也在取代";"人";至";hugent"工艺";至";手工艺;等等
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'),
],
},
}
因此,我尝试将find-and-replace参数从('man', 'gent')
更新为('man ', 'gent ')
(最后为空格(,然后更新为(' man ', ' gent ')
(两端为空格(。但这两个变化都没有改变任何单词,甚至连原来的(唯一的(";人";。
那么我该如何改变";他是一个好人——一个真正的人道主义者;至";他是一个好绅士,一个真正的人道主义者;不让它成为一个巨大的实体?
你希望"man"出现,但只能出现在它本身——换句话说,只有在它前面或后面没有作为单词一部分的其他字母或符号的情况下。
我不知道马拉地语中是否包含像"-"这样的符号,这可能是一个单词的一部分,例如"他是一个真正的男人孩子",在这种情况下,你可能想也可能不想取代它。
在英语中,由于您使用的是regex,因此可以执行以下操作:
'man': {
'regex': True,
'msg': {'mr': 'man → gent'},
'replacements': [
('(?<=[^w]|^)man(?=[^w]|$)', 'gent'),
],
}
这里的正则表达式'(?<=[^w]|^)man(?=[^w]|$)'
表示:
- 字面上的单词"man">
- 前面有任何不是单词字符
[^w]
或行^
开头的字符 - 后面跟着任何不是字字符
[^w]
的字符或行$
的末尾
请注意,这不包括Man
,除非您的正则表达式引擎已经设置为不区分大小写。
如果你的正则表达式引擎不认为组成马拉地语单词的字符是w
的一部分,你可以用组成该语言的所有字符的字符串来代替它,如果这是可以实现的(不像中文等语言(。
请注意,在某些环境中测试regex时,它需要|^
和|$
,而在其他环境中,它可能会导致问题。
在纯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])
可能就是你所需要的。(我希望这里的马拉地语不是偶然的粗鲁——我责怪谷歌翻译(
你为什么不试试这个-把(man(变成gent。然后运行另一个代码并将所有(hugent(替换为(human(一个简单的修复程序。