Python正则表达式除去年份之外删除数字

时间:2015-12-16 06:44:39

标签: python regex

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

 RewriteEngine on
RewriteCond %{THE_REQUEST} /index\.php\?id=([^?]+)\?var=([^&]+)&var2=([^&]+)&var3=([^\s]+) [NC]
RewriteRule ^index\.php$ /path1/path2/ [QSA,NC,L,R]

进入这个字符串:

RewriteCond %{THE_REQUEST} /id=([^?]+)\?var=([^&]+)&var2=([^&]+)&var3=([^\s]+) [NC

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

我一直在寻找像

这样的正则表达式功能
'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text'

我已经能够提出'foo bar 1992 some text' (<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' 的{​​{1}}而不是(?<=\b[12]{1}[0-9]{2})[0-9(.,)+]{1}\b 。{/ p>

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

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

>>> 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范围之外的非数字或非年数开头的任何内容。

答案 1 :(得分:1)

您可以使用以下方法并确定每个数字是否在正确的范围内。如果需要,这可以很容易地修改数字范围:

import re

def year(match):
    try:
        if 1000 <= int(match.group(1)) <= 2999:
            return match.group(1)
    except ValueError, e:
        pass
    return ''


text = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text'
print re.sub('([0-9,.]+)', year, text)

这会显示:

foo bar    1992      some text

答案 2 :(得分:0)

import re
s = 'foo bar 12 3.4 32 1992 112 0433 3312 182470921358 3,412 some text'
p = r'((\b[0-9][0-9.,]{0,2}\b)|(\b[0-9][0-9.,]{4,}\b))|(\b[03-9][\d]{3}\b)'
print re.sub(p, '', s)

输出:

'foo bar    1992      some text'

愚蠢的方法。