nvda的regexp在所有大写字母之间放置空格?

时间:2015-11-22 23:19:42

标签: python regex

所以,我使用NVDA,一个免费的屏幕阅读器,用于许多人使用的盲人,以及一个语音合成器。我正在构建一个包含修改版本的插件的库,以及可以包含python可接受的正则表达式的字典,以及标准的单词替换操作。 我的意思是,我不知道如何设计一个在大写字母之间放置空格的正则表达式,例如在ANM中,合成器将其视为一个单词,而不是像它应该拼写它。 我不知道有足够的python手动为这个东西编写插件,我只使用regexp来做这种事情。我知道正则表达式基础知识,一般实现,你可以通过谷歌搜索“约55分钟内的正则表达式”找到。 我希望它能做到这样的事情。

Input: ANM
Output: A N M

另外,对于这种语音合成器的工作方式,我可能不得不用eh取代A,这样就可以了。

Input: ANM
Output: Eh N M

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

2 个答案:

答案 0 :(得分: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的回答中提到的那样。

答案 1 :(得分: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))