0

文字列を別の文字列に置き換えようとすると、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>"

誰かがこの理由を明確にできますか?

4

2 に答える 2

3

あなたの表現はひどく複雑すぎます。以下は、まったく同じパターンに一致する簡略化です。

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)'

先読みアサーション((?=[\s\.,T]|\Z)一部)が原因で、タイムストリングが一致していません。一致は、空白、ピリオド、コンマ、文字T、または文字列の終わりが後に続くものに制限されます。最初の文字列の直後にWed文が続きます。空白はありません。

次のsentence一致します:

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

タイムゾーンの後の余分なスペースに注意してください。

于 2012-10-19T15:14:11.650 に答える
1

ここでいくつか問題があります。まず、あなたの非常に複雑なパターン。次に、次のようなことはできません。

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

プラス記号が原因で、文字列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'

それが役に立てば幸い。

于 2012-10-19T16:39:08.910 に答える