python中的re.sub并不总是替换字符串
当我尝试用另一个字符串替换一个字符串时,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})*
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'