是否有必要在正则表达式中使用 OR 运算符 (|) 来匹配无序的子字符串?

Is it necessary to use a OR-operator (|) in regex expression to match unordered substrings?

在python对C语言进行运行词法分析时,遇到以下麻烦:

整数类型可以以 u(U) 、 l(L) 修饰符或两者结尾,以任何顺序指定 unsignedlong 输入整数。

我现在正在写正则来匹配这个类型然后扫描分词,我写的正则如下:

    '''Dec'''
    r'\b([1-9][0-9]*)[uU]?[lL]?\b|\b([1-9][0-9]*)[lL][uU]\b'
    '''Oct'''
    r'\b0[0-7]*[uU]?[lL]?\b|\b0[0-7]*[lL][uU]\b'
    '''hex'''
    r'\b0[xX][a-fA-F0-9]+[uU]?[lL]?|\b0[xX][a-fA-F0-9]+[lL]?[uU]?' 

正如我们在这里看到的,为了匹配 ul 修饰符的两个顺序 ullu(大写或小写),我必须写正则表达式中的 OR 运算符 | 并重复其他部分以涵盖这两个条件。

有没有一种简单优雅的方法来编写正则表达式来匹配两个无序部分而不重复?

您可以仅将组放置在您的模式的 end 处,如下所示:

([lL][uU]|[uU]?[lL]?)

这涵盖了所有五种情况:(blank)luluul

比如你原来的图案:

r'\b([1-9][0-9]*)[uU]?[lL]?\b|\b([1-9][0-9]*)[lL][uU]\b'

变为:

r'\b([1-9][0-9]*)([lL][uU]|[uU]?[lL]?)\b'

请注意,您可以使用不区分大小写的正则表达式进一步简化此操作:

'''Dec'''
re.compile('\b([1-9][0-9]*)(lu|u?l?)\b', re.IGNORECASE)

类似地,对于其他数字格式,我们得到:

'''Oct'''
re.compile('\b0[0-7]*(lu|u?l?)\b', re.IGNORECASE)
'''Hex'''
re.compile('\b0x[a-f0-9]+(lu|u?l?)\b', re.IGNORECASE)