所以,我使用NVDA,一个免费的屏幕阅读器,用于许多人使用的盲人,以及一个语音合成器。我正在构建一个包含修改版本的插件的库,以及可以包含python可接受的正则表达式的字典,以及标准的单词替换操作。 我的意思是,我不知道如何设计一个在大写字母之间放置空格的正则表达式,例如在ANM中,合成器将其视为一个单词,而不是像它应该拼写它。 我不知道有足够的python手动为这个东西编写插件,我只使用regexp来做这种事情。我知道正则表达式基础知识,一般实现,你可以通过谷歌搜索“约55分钟内的正则表达式”找到。 我希望它能做到这样的事情。
Input: ANM
Output: A N M
另外,对于这种语音合成器的工作方式,我可能不得不用eh取代A,这样就可以了。
Input: ANM
Output: Eh N M
如果有可能的话,你们中的任何人都可以为我提供正则表达式吗?不,我不认为我可以在循环中编译它们,因为我没有编写python。
答案 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))