我正在寻找一个转换这个字符串的正则表达式:
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>
有什么建议吗?
答案 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'
(?!(\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'
愚蠢的方法。