python中的re.sub并不总是替换字符串

python中的re.sub并不总是替换字符串,python,regex,python-2.7,Python,Regex,Python 2.7,当我尝试用另一个字符串替换一个字符串时,re.sub方法并不总是这样 sentence = '<date>2004/12/01</date>T09:38:27+01:00'+ 'Wed, <date>2012/9/05</date> 10:55:17 UTC %3C%3C%3C' time_identifier = u'(?<=[\s\.,T])([\d]{2}[:]{1}[\d]{2}([:]{1}[\d]{2})*

当我尝试用另一个字符串替换一个字符串时,re.sub方法并不总是这样

sentence = '<date>2004/12/01</date>T09:38:27+01:00'+
           'Wed, <date>2012/9/05</date> 10:55:17 UTC %3C%3C%3C'

time_identifier = u'(?<=[\s\.,T])([\d]{2}[:]{1}[\d]{2}([:]{1}[\d]{2})*[\s\.,+]*(UTC|GMT|CEST|EDT|IST|BST)*(\d\d:\d\d)*)(?=[\s\.,T]|\Z)|'\
                  u'(?<=\A)([\d]{2}[:]{1}[\d]{2}([:]{1}[\d]{2})*[\s\.,+]*(UTC|GMT|CEST|EDT|IST|BST)*(\d\d:\d\d)*)(?=[\s\.,T]|\Z)'
time = re.search(time_identifier, sentence, flags=re.U|re.I)
    if time:
        try:
            sentence = re.sub(time.groups()[0], '<time>%s</time>'%time.groups()[0], sentence, flags=re.U|re.I)
        except:
            sentence = re.sub(time.groups()[4], '<time>%s</time>'%time.groups()[4], sentence, flags=re.U|re.I)
句子='2004/12/01T09:38:27+01:00'+
'2012年9月5日星期三10:55:17 UTC%3C%3C%3C'

time_identifier=u'(?您的表达式过于复杂。以下是与完全相同的模式相匹配的简化:

time_identifier = u'(?:(?<=[\s\.,T])|\A)(\d\d:\d\d(:\d\d)*[\s\.,+]*(UTC|GMT|CEST|EDT|IST|BST)*(\d\d:\d\d)*)(?=[\s\.,T]|\Z)'

请注意时区后的额外空间。

您的表达式过于复杂。以下是与完全相同的模式相匹配的简化:

time_identifier = u'(?:(?<=[\s\.,T])|\A)(\d\d:\d\d(:\d\d)*[\s\.,+]*(UTC|GMT|CEST|EDT|IST|BST)*(\d\d:\d\d)*)(?=[\s\.,T]|\Z)'

请注意时区后的额外空间。

这里有几个问题。首先,您的模式非常复杂。其次,您不能执行以下操作:

re.sub('09:38:27+01', "<time>'09:38:27+01'</time>, s)

希望能有所帮助。

您在这里有几个问题。首先,您的模式非常复杂。其次,您不能执行以下操作:

re.sub('09:38:27+01', "<time>'09:38:27+01'</time>, s)

希望能有帮助。

如果你打印
time.groups()[0]
,你会发现你的正则表达式没有抓住
09:38:27+01:00
。我不知道为什么(我也不打算尝试整理那些可怕的re并找出原因)。我没有时间研究您的问题,但我强烈建议您设计表达式,这在某种程度上应该会有所帮助。您确实希望简化该表达式;
[:]{1}
只是一种非常冗长的方式,表示
;例如,只匹配一个冒号。同样,也不需要将
\d
括在括号中(
[\d]
\d
)相同,
\d\d
\d{2}
@Martijn略短:我在构建正则表达式时考虑了许多其他日期格式。我肯定会改变them@mgilson:在我的电脑上测试时,正则表达式捕获09:38:27+01:00,但如果打印
time.groups()[0]则不会标记
,你会发现你的正则表达式并没有抓住
09:38:27+01:00
。我不知道为什么(我也不打算尝试整理那些可怕的re并找出答案)。我没有时间研究您的问题,但我强烈建议您设计表达式,这在某种程度上应该会有所帮助。您确实希望简化该表达式;
[:]{1}
只是一种非常冗长的方式,表示
;例如,只匹配一个冒号。同样,也不需要将
\d
括在括号中(
[\d]
\d
)相同,
\d\d
\d{2}
@Martijn略短:我在构建正则表达式时考虑了许多其他日期格式。我肯定会改变them@mgilson:在我的电脑上测试时,正则表达式捕获09:38:27+01:00,但不标记
re.sub('09:38:27+01', "<time>'09:38:27+01'</time>, s)
p = '((?:\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})|(?:\\d{2}:\\d{2}:\\d{2} UTC|GMT|CEST|EDT|IST|BST))'
result = re.findall(p, s)
print result
['09:38:27+01:00', '10:55:17 UTC']
r0 = result[0]
r0 = re.sub('\+', r'\+', r0)
s = re.sub(r0, "<time>%s</time>" % result[0], s)
s = re.sub(result[1], "<time>%s</time>" % result[1], s)
print s
'<date>2004/12/01</date>T<time>09:38:27+01:00</time>Wed, <date>2012/9/05</date> <time>10:55:17 UTC</time> %3C%3C%3C'