0

C# 関数を Python に変換しています。存在する機能と互換性のあるバグのためのバグです。

これはその関数の正規表現です: http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)*. しかし、Python はそれをコンパイルできません:

>>> re.compile(r"http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)*")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.3/re.py", line 214, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python3.3/re.py", line 281, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 498, in compile
    code = _code(p, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 483, in _code
    _compile(code, p.data, flags)
  File "/usr/lib/python3.3/sre_compile.py", line 75, in _compile
    elif _simple(av) and op is not REPEAT:
  File "/usr/lib/python3.3/sre_compile.py", line 362, in _simple
    raise error("nothing to repeat")
sre_constants.error: nothing to repeat

注: その正規表現の JavaScript バージョンがあります: /http:\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi.

エラーについて検索しましnothing to repeatたが、何も見つかりませんでした。 申し訳ありませんが、これは重複した投稿です。

問題はどこだ?

4

2 に答える 2

10

私はエラーを再現しました:

re.compile(r"([A]*)*")

問題は[A]*、空の文字列に一致する可能性があることです。([A]*)*when[A]*が空の場合に一致させようとするとどうなるでしょうか? 「何も繰り返さない」。ただし、正規表現エンジンは、それが実際に起こるのを待ちません。シナリオが発生する可能性がリモートでもあるため、失敗します。

これはあなたのために働くはずです:

r"http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)"

最後の を削除しました*

于 2013-04-11T04:56:36.487 に答える