文字列からいくつかのフィールドを抽出したいのですが、いくつあるかわかりません。正規表現を使用しましたが、理解できない問題がいくつかあります。
例えば:
199 -> (199)
199,200 -> (199,200)
300,20,500 -> (300,20, 500)
試してみましたが、なかなかうまくいきません。誰かが私にいくつかのアドバイスを与えることができることを願っています。私は感謝します。
私が試した正規表現:
>>> re.match('^(\d+,)*(\d+)$', '20,59,199,300').groups()
('199,', '300')
// in this, I do not really care about ',' since I could use .strip(',') to trim that.
私はいくつかのグーグルをしました:そしてre.findallを使おうとしました、しかし私はこれをどうやって得るのかわかりません:
>>> re.findall('^(\d+,)*(\d+)$', '20,59,199,300')
[('199,', '300')]
-------------------------------------------------- - - アップデート
全体の話をしなくても、この質問は混乱を招く可能性があることに気づきました。基本的に、crontab(または同様のもの)で定義された構文を検証したい
_VALID_EXPRESSIONの配列を作成します。これはネストされたタプルです。
(field_1,
field_2,
)
field_1ごとに、2つのタプルがあります。
field_1: ((0,59), (r'....', r'....'))
valid_value valid_format
私のコードでは、次のようになります。
_VALID_EXPRESSION = \
12 (((0, 59), (r'^\*$', r'^\*/(\d+)$', r'^(\d+)-(\d+)$',
13 r'^(\d+)-(\d+)/(\d+)$', r'^(\d+,)*(\d+)$')), # second
14 ((0, 59), (r'^\*$', r'^\*\/(\d+)$', r'^(\d+)-(\d+)$',
15 r'^(\d+)-(\d+)/(\d+)$', r'^(\d+,)*(\d+)$')), # minute
16 .... )
私の解析関数では、すべてのグループを抽出して、それらが有効な値の範囲内にあるかどうかを確認するだけです。
私が必要とする正規表現の1つは、この文字列 '50,200,300'に正しく一致し、この場合はすべての数値を抽出できることです。(もちろんsplit()を使用することもできますが、本来の意図を裏切ることになります。そのため、そのアイデアは嫌いです。)
これがお役に立てば幸いです。