1

目標: 数値 (非常に長く、0 より大きい可能性があります) が与えられた場合、その数値の末尾にある 0 を削除して、最も意味のない 5 桁を取得したいと考えています。

これを正規表現で解決しようとしましたが、RegexBuddy の助けを借りて、次のようになりました。

[\d]+([\d]{0,4}+[1-9])0*

しかし、Pythonはそれをコンパイルできません。

>>> import re
>>> re.compile(r"[\d]+([\d]{0,4}+[1-9])0*")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/re.py", line 188, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.5/re.py", line 241, in _compile
    raise error, v # invalid expression
sre_constants.error: multiple repeat

問題は "{0,4}" の後の "+" です。Python では動作しないようです (2.6 でも)

動作する正規表現を作成するにはどうすればよいですか?

PS: 10 で割り始めて、余り n%100000 を使用できることは知っていますが、これは正規表現に関する問題です。

4

5 に答える 5

10

その正規表現は非常に不必要です。これを試して:

>>> import re
>>> re.compile(r"(\d{0,4}[1-9])0*$")

上記の正規表現は、数字が有効であることを前提としています (たとえば、「abc 012345 0」にも一致します)。数字以外の文字がないことを本当に検証する必要がある場合は、次のように使用できます。

>>> import re
>>> re.compile(r"^\d*?(\d{0,4}[1-9])0*$")

とにかく、 は\d文字クラスである必要はなく、量指定子{0,4}は貪欲である必要はありません (追加+で指定されているように、明らかに Python はそれを認識していません)。

また、2 番目の正規表現では、\d貪欲ではありません。これにより、パフォーマンスと精度が向上すると考えられます。また、それがあなたが望むものであると仮定して、「ゼロ以上」にしました。

アンカーも追加しました。これにより、正規表現が文字列の途中にあるものと一致しないことが保証されます。これがあなたが望むものである場合 (長いテキストをスキャンしているのかもしれません)、アンカーを削除してください。

于 2009-06-15T15:02:28.613 に答える
5

\d{0,4}+ は、.NET や Java などの特定の正規表現でサポートされている所有量指定子です。Python は所有量指定子をサポートしていません。

RegexBuddy で、上部のツールバーで [Python] を選択すると、RegexBuddy は、Python が所有量指定子をサポートしていないことを通知します。+ は正規表現で赤く強調表示され、[作成] タブにエラーが表示されます。

RegexBuddy の [使用] タブで [Python] を選択すると、RegexBuddy は、所有量指定子のない正規表現と、所有量指定子を削除すると異なる結果が生じる可能性があることを示すコメントを含む Python ソース コード スニペットを生成します。RegexBuddy が質問の正規表現を使用して生成する Python コードは次のとおりです。

# Your regular expression could not be converted to the flavor required by this language:
# Python does not support possessive quantifiers

# Because of this, the code snippet below will not work as you intended, if at all.

reobj = re.compile(r"[\d]+([\d]{0,4}[1-9])0*")

おそらく、メイン ツールバーで Java などのフレーバーを選択し、[正規表現を Python 文字列としてコピー] をクリックしたことでしょう。これにより、Pythong 文字列としてフォーマットされた Java 正規表現が得られます。[コピー] メニューの項目は、正規表現を変換しません。単に文字列としてフォーマットします。これにより、JavaScript の正規表現を Python 文字列としてフォーマットして、サーバー側の Python スクリプトが正規表現をクライアント側の JavaScript コードにフィードできるようにすることができます。

于 2009-06-16T14:38:24.160 に答える
2

小さなヒント。RegExBuddy の代わりにreTestでテストすることをお勧めします。プログラミング言語ごとに異なる正規表現エンジンがあります。ReTest は、Python 自体の中で正規表現文字列をすばやくテストできるという点で価値があります。そうすれば、Python の正規表現エンジンで構文をテストしたことを確認できます。

于 2009-06-15T14:56:55.303 に答える
0

これが私の解決策です。

re.search(r'[1-9]\d{0,3}[1-9](?=0*(?:\b|\s|[A-Za-z]))', '02324560001230045980a').group(1)

「4598」

  • [1-9]- 番号は 1 ~ 9 で始まる必要があります
  • \d{0,3}- 0 または 3 桁
  • [1-9]- 番号は 1 または 9 で終わる必要があります
  • (?=0*(:?\b|\s\|[A-Za-z]))\b- 文字列の最後の部分は、0 およびまたは,から形成する必要があります\s[A-Za-z]
于 2012-09-13T10:13:53.760 に答える
0

エラーは、{0,4} と + という 2 つの量指定子が連続していることにあるようです。ここで + がリテラルであることを意図していない限り (数字について話しているので、それは疑わしい)、まったく必要ないと思います。この状況で別のことを意味しない限り (おそらく {} 量指定子の貪欲さ)? 私は試してみます

[\d]+([\d]{0,4}[1-9])0*

実際に両方の量指定子を適用するつもりなら、これでうまくいくかもしれません

[\d]+(([\d]{0,4})+[1-9])0*

しかし、あなたの問題の仕様を考えると、それがあなたが望んでいることだとは思えません。

于 2009-06-15T15:02:18.070 に答える