如何在 python 的 search/find 字符串中添加 space?

How to add space in python's search/find string?

我已经 运行 成为马拉地语维基百科上的 pywikibot 差不多一个月了。该机器人的唯一任务是查找和替换。您可以在以下位置找到 pywikibot 的全部详细信息:pywikibot. You can find the details of that particular find and replace operation at replace.py and fixes.py and even further examples of fixes here.

以下是我的部分源代码。当 运行 马拉地语维基百科上的机器人时,由于马拉地语的脚本,我遇到了困难。所有的替代品都很好,但一个不是。例如,我将使用英文单词而不是马拉地语。

以下代码的第一部分(“修复”)搜索“{{PAGENAME}}”,并将其替换为“{{subst:PAGENAME}}”。 msg参数是编辑摘要。

代码“man”的第二次修复,找到“man”并将其替换为“gent”。但问题是,它也在把“human”换成“hugent”,把“craftsmanship”换成“craftsgentship”等等。

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 ')(最后是space),然后再更新为(' man ', ' gent ')(space 在两端)。但是这两个变化都没有改变任何词,甚至没有改变原来的(唯一的)“man”。

那么如何将“他是一个好人 - 一个真正的人道主义者”的实例更改为“他是一个好绅士 - 一个真正的人道主义者”而不使其成为巨大的?

您想要 'man' 出现,但只出现一次 - 换句话说,只有当它前面或后面没有其他字母或符号作为单词的一部分时。

我不知道马拉地语是否包含像“-”这样可能是单词一部分的符号,例如 'He was a real man-child',在这种情况下,您可能想要也可能不想替换它。

在英语中,由于您使用的是正则表达式,因此您可以这样做:

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

正则表达式'(?<=[^\w]|^)man(?=[^\w]|$)'表示:

  • 字面意思 'man'
  • 前面有任何不是单词字符的字符 [^\w],或者行的开头 ^
  • 后跟不是单词字符的任何字符 [^\w],或行尾 $

请注意,这不包括 Man,除非您的正则表达式引擎已设置为 case-insensitive。

如果您的正则表达式引擎不认为构成马拉地语单词的字符是 \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 翻译)

你为什么不试试这个 - 把(男人)变成绅士。 然后 运行 另一个代码并将所有 (hugents) 替换为 (human) 一个简单的修复。