regexp让nvda在所有大写字母之间加空格?

2024-05-16 01:37:54 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我使用NVDA,一个很多人使用的盲人免费屏幕阅读器和一个语音合成器。我正在构建一个插件的修改版本库,其中包含python可以接受的正则表达式以及标准的单词替换操作。 我的问题是,我不知道如何设计一个正则表达式,它将在大写字母之间放置一个空格,比如在ANM中,synth将其表示为一个单词,而不是像它应该的那样拼写。 我不知道足够的python来为这个东西手动编写一个插件,我只使用regexp来完成这类事情。我知道正则表达式的基本知识,一般的实现,你可以通过google“55分钟内的正则表达式”找到它。 我想让它这样做。你知道吗

Input: ANM
Output: A N M

另外,按照语音合成器的工作方式,我可能不得不用eh来代替A,这将使这个。你知道吗

Input: ANM
Output: Eh N M

如果可能的话,你们能给我提供一个正则表达式吗?不,我不认为我可以在循环中编译它们,因为我没有编写python。你知道吗


Tags: 版本插件inputoutput标准屏幕语音大写字母
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))

好吧,找到答案了。以一定的顺序使用一系列正则表达式,我让它工作起来。谢谢你们,你们帮我建立了基础,我很感激你们。你知道吗

这应该是大写字母的诀窍,它使用?=来展望下一个大写字母,而不会“吃掉它”:

>>> 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

我在“replacements”代码中构建了一个regex,以正确处理大写单词和句子末尾的独立大写字母。如果你想避免用“eh”替换独立的“A”,那么@fjarri的答案中提到的更高级的regex替换函数就是一个不错的选择。你知道吗

相关问题 更多 >