Skip to main content
 首页 » 编程设计

Python正则表达式删除除年份以外的数字

2024年08月23日4052php

我正在寻找一个可以转换这个字符串的正则表达式:

'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 

进入这个字符串:

'foo bar    1992      some text' 

也就是说,我想从字符串中删除除代表年份 (1000 - 2999) 的数字之外的所有数字。

我正在寻找一个正则表达式功能来做类似的事情

(<PATTERN1> except <PATTERN2>) 

我已经能够想出 <PATTERN1>和 <PATTERN2> :

<PATTERN1> -> \b[0-9(.,)+]*\b 
<PATTERN2> -> \b[12]{1}[0-9]{3}\b 

在代码中:

>>> import re 
>>> s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
>>> re.sub(r'\b[0-9(.,)+]*\b', '', s) 
'foo bar          some text' 
>>> import re 
>>> print re.sub(r'\b[0-9(.,)+]*\b', '', s) 
foo bar          some text 
>>> re.sub(r'\b[12]{1}[0-9]{3}\b', '', s) 
'foo bar 12 3.4 32  112 0433 3312 182470921358 3,412 some text' 

但我没能把它们放在一起。积极的后视也无济于事。

这个:

(?<=\b[12]{1}[0-9]{2})[0-9(.,)+]{1}\b 

仅匹配 2的 1992而不是 1992完全。

有什么建议吗?

请您参考如下方法:

您可以使用这个基于负前瞻的正则表达式:

>>> s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text' 
>>> print re.sub(r'\b(?!(\D\S*|[12][0-9]{3})\b)\S+\b', '', s) 
'foo bar    1992      some text' 

RegEx Demo

(?!(\D\S*|[12][0-9]{3}) 将匹配任何以非数字或非年份数字开头的内容1000-2999 范围。