1

以下の URL を数時間照合しようとしましたが、理解できないようで、それほど難しくないと確信しています。

URL は次のようになります。

/course/lesson-one/

または、次のこともできます。

/course/lesson-one/chapter-one/

私が持っているのは、2番目のURLに一致する次のものです:

/course/([a-zA-Z]+[-a-zA-Z]*)/([a-zA-Z]+[-a-zA-Z]*)/

私が望むのは、2番目の部分をオプションにすることですが、私が得た最も近いものは次のとおりです。

/course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/

しかし、上記は何らかの理由で単語の最後の文字を省略しています。たとえば、URL が

/course/computers/

私は文字列「コンピュータ」で終わる

4

3 に答える 3

1

?オプションパーツが必要な場合に使用します。

/course/([a-zA-Z][-a-zA-Z]*)/([a-zA-Z][-a-zA-Z]*/)?
#                                                 ^

[a-zA-Z]+[-a-zA-Z]*(は と同等であることに注意してください[a-zA-Z][-a-zA-Z]*。)

複数の要素を一度にオプションにすることを許可しながら、追加のグループ化を使用して一致から(?:…)除外します。/

/course/([a-zA-Z][-a-zA-Z]*)/(?:([a-zA-Z][-a-zA-Z]*)/)?
#                            ~~~                     ~^

次の理由により、2番目の正規表現は最後の文字を飲み込みます。

  /course/([a-zA-Z]+[-a-zA-Z]*)/*([a-zA-Z]+[-a-zA-Z]*)/
          ^^^^^^^^^^^^^^^^^^^^^  ~~~~~~~~~~~~~~~~~~~~~
        this matches 'computer'  and this matches the 's'.

この正規表現の 2 番目のグループは、+.

于 2013-05-08T20:27:18.540 に答える
1

使う "?" オプションと見なすための何かの後。

>>> r = r"/course/([a-zA-Z]+[-a-zA-Z]*)(/[A-Z[a-z]+[-a-zA-Z]*)?"
>>> s = "/course/lesson-one/chapter-one/"
>>> re.match(r, s).groups()
('lesson-one', '/chapter-one')
>>> s = "/course/computers/"
>>> re.match(r, s).groups()
('computers', None)
于 2013-05-08T20:28:08.807 に答える