【发布时间】:2012-10-19 14:48:01
【问题描述】:
当我尝试用另一个字符串替换一个字符串时,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)
对于上面提供的示例,我希望句子的输出是
<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
但是re.sub方法并没有将原句中的“09:38:27+01:00”替换为
"<time>09:38:27+01:00</time>"
谁能说明原因?
【问题讨论】:
-
如果你打印
time.groups()[0],你会看到你的正则表达式没有抓取09:38:27+01:00。我不知道为什么(而且我不打算尝试对那个可怕的问题进行分类并弄清楚)。 -
我没有时间研究你的问题,但我强烈推荐regex101.com 来设计你的表达方式,应该会有所帮助。
-
你真的想简化那个表达式;
[:]{1}只是表达:的一种非常冗长的方式;例如完全匹配一个冒号。同样,无需将\d括在括号中([\d]与\d相同)。而\d\d比\d{2}略短。 -
@Martijn:我在构建正则表达式时考虑了许多其他日期格式。我一定会改变它们
-
@mgilson:在我的电脑上测试,正则表达式捕获 09:38:27+01:00,但没有标记
标签: python regex python-2.7