1

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

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

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

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

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 为空时,我会在每个字母之间留出空格:

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

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

谢谢你的帮助

4

1 回答 1

1

使正则表达式类似于()|abcmatch是不可能的abc,因为()匹配任何字符串和字符串中的任何位置(这就是为什么你在每个字符之前都有一个空格)。与任何其他 NFA 正则表达式一样,|匹配组中的第一个备选方案会使正则表达式引擎停止分析右侧的其他备选方案,它们都被跳过。请参阅记住 Regex 引擎是 Eager

在这种情况下,您可以通过使用在任何文本中都找不到的单词来初始化列表来解决此问题。exceptions

例如,

exceptions = ['n0tXistIнgŁąrd']
于 2020-02-26T18:42:45.030 回答