如何编写用于NVDA的正则表达式,在所有大写字母之间添加空格?

3

所以,我使用NVDA,这是一个免费的屏幕阅读器,许多人都在使用,还有一个语音合成器。我正在建立一个修改后的插件库,并包含Python可接受的正则表达式和标准单词替换操作的词典。 我的问题是,我不知道如何设计一个正则表达式,在大写字母之间放置一个空格,比如ANM,合成器会将其作为一个单词而不是按照应该拼写的方式来拼读。 我不太懂Python,无法手动编写插件来解决这个问题,我只能使用正则表达式来处理这种情况。我了解正则表达式的基础知识和一般实现方法,可以通过谷歌搜索“55分钟内学习正则表达式”来找到相关信息。 我希望它能像这样做。

Input: ANM
Output: A N M

由于这个语音合成的工作方式,我可能需要用“eh”替换“A”,这样会变成这样。

Input: ANM
Output: Eh N M

如果可能的话,你能否提供一个正则表达式来完成这个任务?不过我不认为我可以通过循环编译它们,因为我并没有编写Python程序。

3个回答

3

对于大写字母,这应该是一个有效的解决方法,它使用?=来预测下一个大写字母而不会“吞掉”它:

>>> import re
>>> re.sub("([A-Z])(?=[A-Z])", r"\1 ", "ABC thIs iS XYZ a Test")
'A B C thIs iS X Y Z a Test'

如果你需要进行大量的替换操作,将这些替换内容放入一个变量中可能是最简单的方法:
replacements = [("A", "eh"), ("B", "bee"), ("X", "ex")]
result = re.sub("([A-Z])(?=[A-Z])", r"\1 ", "ABC thIs iS XYZX. A Xylophone")
for source, dest in replacements:
    result = re.sub("("+source+r")(?=\W)" , dest, result)
print(result)

输出:

eh bee C thIs iS ex Y Z ex. eh Xylophone

我在“替换”代码中构建了一个正则表达式,以正确处理大写单词和句子末尾的独立大写字母。如果您想避免将独立的“A”替换为“eh”,那么像@fjarri答案中提到的更高级的正则表达式替换函数是可行的方法。


嗯,由于这个字典的工作方式,我无法将原始的Python代码输入其中,但我希望我能够...我会尝试在这里提到的正则表达式。我不能在同一段文本中多次使用字典的相同条目,但是我可以在同一段文本中使用多个字典条目。所以也许我可以将它们分层并做“eh”这件事。因为“A”产生短的“uh”音,所以“eh”是唯一需要替换的。我可以很容易地这样做,就像这样。条目:\bA\b替换:eh - Colton Hill

3

虽然@Galax的解决方案确实可行,但如果您在匹配上使用回调函数,则可以更轻松地处理缩写的进一步处理(这样您就不会替换任何独立的大写字母):

import re

s = "This is a normal sentence featuring an abbreviation ANM. One, two, three."

def process_abbreviation(match_object):
    spaced = ' '.join(match_object.group(1))
    return spaced.replace('A', 'Eh')

print(re.sub("([A-Z]{2,})", process_abbreviation, s))

1
是的,正则表达式回调是更好的方法。我添加了一个解决方法来防止大写单词受到影响,但我不确定我的代码处理独立大写字母是一个错误还是一个特性 ;) - Galax
所以,看起来使用正则表达式之一时,“([A-Z])(?=[A-Z])”,我的合成器会正确地替换内容。例如,BAC会发出bee eh see的声音,而不是back。但是,我最初使用的ANM会发出uh en em的声音。那么,是否有另一个修改了这个正则表达式的正则表达式,将A替换为Eh,并且只在它是缩写的一部分时才这样做,以便如果我说: A dude is a dude. 输出不应该是: Eh dude is a dude。 但是如果我说 ANM 输出应该是 Eh N M。 实际上,我没有在屏幕上看到它,它是直接传递给语音合成器的。 - Colton Hill

0

好的,我找到了答案。按照一定顺序使用正则表达式,我让它工作起来了。谢谢你们,你们帮助我形成了基础,我很感激。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接