2

Pythonの正規表現を使用して、テキストからURLの一部を抽出しています。私が探しているURLは限られたパターンのセットからのものであるため、正規表現でそれらを処理できるはずだと感じています。私が抽出しようとしているのは、ファイル名の最初の部分(以下のすべての例では「some.file.name」)であり、ドット、文字、数字を含めることができます。

URLが取ることができる形式の種類は次のとおりです。

http://www.example.com/some.file.name.html
http://www.example.com/some.file.name_foo.html
http://www.example.com/some.file.name(123).html
http://www.example.com/some.file.name_foo(123).html
http://www.example.com/some.file.name
http://www.example.com/some.file.name_foo
http://www.example.com/some.file.name(123)
http://www.example.com/some.file.name_foo(123)

私はこの正規表現でほとんどそこにいると思います:

http://www\.example\.com/([a-zA-Z0-9\.]+)(_[a-z]+)?(\(\d+\))?(\.html)?

ただし、URLがリストの最初のURLのようである場合は、一致に「.html」が含まれます。これを止める方法はありますか、それとも正規表現の根本的な制限ですか?

コード内の拡張子は常に同じであり、ファイル名の一部として有効になることはないため、コードから削除することは非常に喜ばしいことですが、正規表現の一致の一部として削除する方がクリーンです。

編集:

これらのURLは本文に含まれていることを強調しておく必要があります。前後に文字があるかどうか、またはそれらの文字が何であるかについては保証できません。数字、文字、アンダースコア、ドットではないと考えるのが安全だと思います。

4

3 に答える 3

2

正規表現は、デフォルトで貪欲に一致します。

この正規表現を試してください:

^http://www\.example\.com/([a-zA-Z0-9\.]+?)(_[a-z]+)?(\(\d+\))?(\.html)?$

最初の部分でを?キャプチャしないように追加されていることに注意してください。.htmlこれにより、最初のグループキャプチャは、可能な限り一致させるのではなく、一致させるために必要なものを最小限に抑えます。がない場合?.html他のグループはオプションであるため、は最初のグループに含まれ、欲張りマッチングは可能な限り「早期」にマッチングを試みます。

^PSまた、とを使用して正規表現を固定し、$常にフルラインに一致させることに注意してください。

于 2012-05-31T07:25:00.880 に答える
0

あなたはファイル拡張子を気にしないように私には聞こえます。ファイル名を抽出したいだけです。

これを試してください:

http://www\.example\.com/([\w]+.[\w]+.[\w()]+)

PHPでは、preg_match_all($ regex、$ str、$ matches)を使用しましたが、次のようなものが返されました。

Array
(
    [0] => Array
        (
            [0] => http://www.example.com/some.file.name
            [1] => http://www.example.com/some.file.name_foo
            [2] => http://www.example.com/some.file.name(123)
            [3] => http://www.example.com/some.file.name_foo(123)
            [4] => http://www.example.com/some.file.name
            [5] => http://www.example.com/some.file.name_foo
            [6] => http://www.example.com/some.file.name(123)
            [7] => http://www.example.com/some.file.name_foo(123)
        )

    [1] => Array
        (
            [0] => some.file.name
            [1] => some.file.name_foo
            [2] => some.file.name(123)
            [3] => some.file.name_foo(123)
            [4] => some.file.name
            [5] => some.file.name_foo
            [6] => some.file.name(123)
            [7] => some.file.name_foo(123)
        )

)

それが役に立てば幸い!

于 2012-05-31T09:32:02.810 に答える
0

.html拡張子を非キャプチャグループとして指定できます。

http://www\.example\.com/([a-zA-Z0-9\.]+)(_[a-z]+)?(\(\d+\))?(?=(\.html)?)
于 2012-05-31T07:24:49.483 に答える