值得注意的是,正则表达式引擎一旦找到匹配项就会停止急切地搜索。然后,订单在某些情况下很重要,因为它不会继续检查交替中的剩余选项。
此正则表达式的目的是两个部分的复合:
- 删除字符串开头的数字,只要这些数字不在KINDER, SECONDARY, ELEMENTARY之前。这很简单,我们可以通过以下方式实现:
(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))
- 将构成序数的数字和字母组合在一起(在此处解释)。举个例子,像
10 st
become这样的字符串10st
,但是像abcdefg238947 th
DO 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)
具有以下字符串,引擎应设置在一起1
和ST
。然后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)