Python 中的正则表达式:仅在不在列表中时将单词与数字分开(变量异常)

Regex in Python: Separate words from numbers JUST when not in list (Variable exception)

此问题与 有关。我想要变量异常,它可以接收字母数字变量列表或 null。

例如,我有一个虚拟函数 returns 可能的字母数字值,这些字母和数字必须保持在一起:

def get_substitutions(word):
    if word.lower() == 'h20':
        return 'h20'
    return None

此外,我有以下主要功能来获取那些不必分开的可能的字母数字值。如果文本变量(输入)在异常中有字母数字词,则不会将其分开,否则添加 space :

import re

text='1ST STREET SCHOOL'

exceptions = list()

for word in re.sub(r'[^\w]+', ' ', text, 0, re.IGNORECASE).split():
    if get_substitutions(word):
        exceptions.extend([word.lower()])

exception_rx = '|'.join(map(re.escape, exceptions))
generic_rx = r'(?<=\d)(?=[^\d\s])|(?<=[^\d\s])(?=\d)'
rx = re.compile(rf'({exception_rx})|{generic_rx}', re.I)

print(rx.sub(lambda x: x.group(1) or " ", text))

但是,当 exception_rx 为空时,我在每个字母之间得到 space:

1 S T   S T R E E T   S C H O O L 

是否可以在不包含任何 if 语句并仅使用正则表达式语法的情况下处理这种情况?

感谢您的帮助

不可能使像 ()|abc 这样的正则表达式匹配 abc,因为 () 匹配任何字符串 和字符串中的任何位置 (这就是为什么你在每个字符之前得到一个 space )。与任何其他 NFA 正则表达式一样,匹配 | 的组中的第一个备选方案使正则表达式引擎停止分析右侧的其他备选方案,它们都被跳过。参见 Remember That The Regex Engine Is Eager

在这种情况下,您可以 解决 这个问题,方法是 使用您永远不会在任何文本中找到的词初始化 exceptions 列表.

例如,

exceptions = ['n0tXistIнgŁąrd']