superrino130
@superrino130 (super rino)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

名前付きキャプチャの正規表現のエラーを修正したい

解決したいこと

下記、正規表現をRubyに移植したい。
( from python 3.7 to ruby 2.7 )

    # Adapted from http://stackoverflow.com/questions/2764269/parsing-an-xsduration-datatype-into-a-python-datetime-timedelta-object
    _duration_parser = re.compile(
        (r'(?P<sign>-?)P(?:(?P<years>\d+\.?\d*)Y)?(?:(?P<months>\d+\.?\d*)M)?(?:(?P<days>\d+\.?\d*)D)?(?:T(?:(?P<hours>\d+\.?\d*)H)?(?:(?P<minutes>\d+\.?\d*)M)?(?:(?P<seconds>\d+\.?\d*)S)?)?'))

発生している問題・エラー

@_duration_parser = Regexp.compile('(?P<sign>-?)P(?:(?P<years>\d+\.?\d*)Y)?(?:(?P<months>\d+\.?\d*)M)?(?:(?P<days>\d+\.?\d*)D)?(?:T(?:(?P<hours>\d+\.?\d*)H)?(?:(?P<minutes>\d+\.?\d*)M)?(?:(?P<seconds>\d+\.?\d*)S)?)?')

Uncaught exception: undefined group option: /(?P<sign>-?)P(?:(?P<years>\d+\.?\d*)Y)?(?:(?P<months>\d+\.?\d*)M)?(?:(?P<days>\d+\.?\d*)D)?(?:T(?:(?P<hours>\d+\.?\d*)H)?(?:(?P<minutes>\d+\.?\d*)M)?(?:(?P<seconds>\d+\.?\d*)S)?)?/

自分で試したこと

PYTといった文字を外すとエラーは消えますが、Match groupとしては間違っているように思われます。

Error: Line 1: expected "?"
(?P<sign>-?)P(?:(?P<years>\d+\.?\d*)Y)?(?:(?P<months>\d+\.?\d*)M)?(?:(?P<days>\d+\.?\d*)D)?(?:T(?:(?P<hours>\d+\.?\d*)H)?(?:(?P<minutes>\d+\.?\d*)M)?(?:(?P<seconds>\d+\.?\d*)S)?)?
  ^

Error:Unexpected char!

(?P<sign>-?)P(?:(?P<years>\d+\.?\d*)Y)?(?:(?P<months>\d+\.?\d*)M)?(?:(?P<days>\d+\.?\d*)D)?(?:T(?:(?P<hours>\d+\.?\d*)H)?(?:(?P<minutes>\d+\.?\d*)M)?(?:(?P<seconds>\d+\.?\d*)S)?)?
--^
0

2Answer

(?P...)

通常の丸括弧に似ていますが、このグループがマッチした部分文字列はシンボリックグループ名 name でアクセスできます。

単なる名前付きキャプチャとのことなので、?P<name>pat?<name>patするだけでよい模様

2Like

Comments

  1. @superrino130

    Questioner

    はい、何とか目途が立ちました。

Rubyマニュアルの正規表現#キャプチャのページより

1,2,... ではなく、名前を付けることができます。 (?<name>pat)もしくは(?'name'pat)と記述します。

"?P<name>pat"という記述が間違っている気がする

0Like

Comments

  1. @superrino130

    Questioner

    @ktz_alias さん
    コメントありがとうございます。

    > "?P<name>pat"という記述が間違っている気がする

    はい、python側で特別なオプションがあるのかもしれませんね

Your answer might help someone💌