0

テキスト ファイル (正確には csv) を解析するスクリプトを作成しており、各行の内容に基づいてファイルから行を選択したいと考えています。チェックする文字列の条件がいくつかあるので、regexp を使用するのがよいと推測しましたが、モジュロ演算の条件に対して行頭の数値をチェックする必要もあります。これまでのところ、n%4==kandn%2==kです。ただし、アドホックなソリューションしかないようです。n%2==k非常に簡単ですが、確認するn%4==2には、次のようなものを考案する必要がありました。

r'((^\d*[24680]|^)[26]|^\d*[13579][048])[\s;,].*' # more (unrelated) conditions follow

私の質問は次のとおりです。

  1. 上記の正規表現を単純化する方法はありますか? それに明らかな問題はありますか?
  2. スクリプトを他のモジュロ条件 (n%3==kまたは などn%7==k) に一般化する場合、regexp を使用してそれを行う実行可能な方法はありますか、または文字列から数値を抽出し、そのような条件をチェックする追加のコードを記述したほうがよいでしょう。
4

1 に答える 1

1

これはより正確なようですn%4==2(参照: http://en.wikipedia.org/wiki/Divisibility_rule )

r = r'^[26]$|^\d*[02468][26]$|^\d*[13579][048]$'

# test
for i in xrange(1, 1000):
    m = re.match(r, str(i))
    if i % 4 == 2:
        assert m, [i, i % 4]
    else:
        assert not m, i

3 で割り切れる正規表現フィルター番号n%3==0を参照してください。の一般的な解決策を知りません。いずれにせよ、興味深いが純粋に理論的な演習になるでしょう。実生活では、単に int を使用します。mod n

于 2012-09-13T08:43:45.127 に答える