2

Pythonのreモジュールを使用して特定のパターンを一致させようとしています。全文に一致させたい(より正確には、スペースや句読点で区切られた英数字の文字列シーケンスであると言えます)

例えば。

  • 「これは普通の文章です。」
  • 「これも有効です」
  • 「これもそうだ」

正規表現のさまざまな組み合わせを試してみましたが、パターンの動作を正しく把握できず、表現ごとに異なるが説明できない結果が得られました(私は初心者ですが、それでも)。


私は試しました:

  • "((\ w +)(\ s?))*"

    私の知る限り、これは1つ以上の英数字に貪欲に一致し、その後に空白文字が1つまたはまったくない場合に一致し、その後、このパターン全体に貪欲に一致する必要があります。これは見た目とは違うので、明らかに私は間違っていますが、その理由を知りたいと思います。(これにより、結果として文全体が返されると期待していました)上記の最初のサンプル文字列で得られる結果は、[('sentence'、'sentence'、'')、(''、''、'')、 (''、''、'')、(''、''、'')]。

  • "(\ w +?)*"

    これがどのように機能するのかさえわかりません。公式ドキュメント(python help('re'))には、、+ 、? 前のREのxまたはx(貪欲な)繰り返しに一致します。このような場合は、前のREを「?」のスペースにするだけです。または'\w +'は先行するREですか?そして、' '演算子のREは何になりますか?これで得られる出力は['sentence']です。

  • "(\ w + \ s?)+)"などの他の; "((\ w *)(\ s ??))など。これは基本的に、文がアルファ数値のセットであり、その後に単一/有限数の空白が続き、このパターンが繰り返されるという同じ考えのバリエーションです。以上。

誰かが私がどこで間違っているのか、そしてなぜ、そしてなぜ上記の表現が私が期待していたように機能しないのか教えてもらえますか?


PS最終的には「[\w]+」が機能するようになりましたが、これでは継続する空白文字の数を制限できません。

4

4 に答える 4

4

正規表現についてのあなたの推論は正しいです、あなたの問題はキャプチャグループを使用することから来ています*。別の方法は次のとおりです。

>>> s="This is a regular sentence."
>>> import re
>>> re.findall(r'\w+\s?', s)
['This ', 'is ', 'a ', 'regular ', 'sentence']

\bこの場合、単語の境界を一致させるために使用する方が理にかなっている場合があります。

>>> re.findall(r'\w+\b', s)
['This', 'is', 'a', 'regular', 'sentence']

または、を介して文全体を照合し、re.matchを使用re.group(0)して完全一致を取得することもできます。

>>> r = r"((\w+)(\s?))*"
>>> s = "This is a regular sentence."
>>> import re
>>> m = re.match(r, s)
>>> m.group(0)
'This is a regular sentence'
于 2012-07-06T23:35:01.493 に答える
3

これが素晴らしい正規表現チュートリアルのウェブサイトです:

http://regexone.com/

与えられた例に一致する正規表現は次のとおりです。

([a-zA-Z0-9,\. ]+)
于 2012-07-06T23:34:46.533 に答える
0

継続する空白文字の数を制限したいのはなぜですか?文は任意の数の単語(英数字のシーケンス)とスペースを連続して持つことができますが、文は句読点で終わるテキストの領域、または空白を含む上記のシーケンスにないものであるためです。

([a-zA-Z0-9\s])*

上記の正規表現は、0回以上のシリーズまたはシリーズのスペースである文と一致します。ただし、次のように調整できます。

([a-zA-Z0-9])([a-zA-Z0-9\s])*

これは、上記のシーケンスの前に英数字を付ける必要があることを示しています。

これがあなたが探していたものであることを願っています。

于 2012-07-06T23:39:35.060 に答える
0

多分これは役立つでしょう:

import re

source = """
This is a regular sentence.
this is also valid
so is This ONE
how about this one  followed by this one
"""

re_sentence = re.compile(r'[^ \n.].*?(\.|\n|  +)')

def main():
    i = 0
    for s in re_sentence.finditer(source):
        print "%d:%s" % (i, s.group(0))
        i += 1

if __name__ == '__main__':
    main()

私は(\.|\n| +)文の終わりの状態を説明するために表現で交互を使用しています。3番目の交互で2つのスペースを使用していることに注意してください。2番目のスペースには「+」メタ文字が含まれているため、連続する2つ以上のスペースが文の終わりになります。

于 2012-07-07T15:42:23.817 に答える