0

值得注意的是,正则表达式引擎一旦找到匹配项就会停止急切地搜索。然后,订单在某些情况下很重要,因为它不会继续检查交替中的剩余选项。

此正则表达式的目的是两个部分的复合:

  1. 删除字符串开头的数字,只要这些数字不在KINDER, SECONDARY, ELEMENTARY之前。这很简单,我们可以通过以下方式实现:
    (^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER)) 
    
  2. 将构成序数的数字和字母组合在一起(在此处解释)。举个例子,像10 stbecome这样的字符串10st,但是像abcdefg238947 thDO NOT change 这样的字符串。对应的正则表达式如下:
    (?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))
    
    将这两个加在一起时会出现问题。我知道如果我首先设置第二条规则,那么引擎将成功并继续解析:
text= re.sub(r'(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))|(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))',
             '',
             '1 ST KINDER',
             0,
             re.IGNORECASE)

具有以下字符串,引擎应设置在一起1ST。然后1ST在 KINDER 之前拥有不应该匹配第二条规则,但事实并非如此:

1 ST KINDER  --> ST KINDER

更多示例:

10306 KINDER  (OK)
12345 ABC     (OK)
1 ST KINDER   (SHOULD BE 1ST KINDER)
1 AB KINDER   (OK)

如何在相同的正则表达式语句中将两个规则交替设置在一起,如果是序数,则优先将数字和字母放在一起,然后在开头检查数字?

我想要与以下相同的行为:

text= re.sub(r'^\d+\b(?!\s+(?:ELEMENTARY|SECONDARY|KINDER))',
             '',
             re.sub(r'(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))',
                    '',
                    '1 ST KINDER',
                    0,
                    re.IGNORECASE),
             0,
             re.IGNORECASE)
4

0 回答 0