我正在寻找一个可以转换这个字符串的正则表达式:
'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'
(?!(\D\S*|[12][0-9]{3}) 将匹配任何以非数字或非年份数字开头的内容1000-2999 范围。
