Python正则表达式:在某些条件下删除数字的替换

2024-04-28 17:56:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

本正则表达式的目的由两部分组成:

  1. 删除字符串开头的数字,只要 数字不是紧跟在幼儿园、中学、小学之前。 这很简单,我们可以通过以下方式实现:
    (^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER)) 
    
  2. 将构成序号的数字和字母组合在一起 (在here中解释)。例如,像10 st这样的字符串变为10st,但是像abcdefg238947 th这样的字符串不会改变。相应的正则表达式是 以下:
    (?<=[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。那么在KINDER之前有1ST不应该符合第二条规则,但情况并非如此:

1 ST KINDER  --> ST KINDER

更多示例:

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

我如何在同一个regex语句中交替设置这两个规则,如果是序数,则优先将数字和字母放在一起,然后在开头检查数字

我希望有如下相同的行为:

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)

Tags: 字符串text引擎re规则情况ok数字