python - 在Python(Regex)中删除数字而不是日期

我知道how to delete extra-word numbers in Python,带有:

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)

我想知道是否可以在保留日期的同时执行相同的操作:

s = "I want to delete numbers like 84 but not dates like 2015"

用英语来说,一个快速而肮脏的规则可能是:如果数字以18、19或20开头且长度为4,则不要删除。

最佳答案

要匹配以18 / 19 / 20开头的4位数字序列以外的任何数字序列,可以使用

r'\b(?!(?:18|19|20)\d{2}\b)\d+\b'


regex demo

正则表达式匹配:


\b-前导词边界
(?!(?:18|19|20)\d{2}\b)-负向超前限制了后续模式 \d+仅在没有 181920开头时,然后紧跟两位数 \d{2}时才匹配缩短到 (?!(?:1[89]|20)\d{2}\b)的前瞻性,但由于可读性下降,很多人通常对此表示反对)
\d+-1个或多个数字
\b-尾随单词边界


Python code

p = re.compile(r'\b(?!(?:18|19|20)\d{2}\b)\d+\b')
test_str = "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network, 4 5 6 created in 2008"
print p.sub("", test_str)