4

これはばかげた質問かもしれませんが...

次のような文があるとします。

クイックブラウンフォックス

または、次のような文が表示される場合があります。

速い茶色のキツネは怠惰な犬を飛び越えました

単純な正規表現(\ w *)は、最初の単語「The」を見つけてグループに入れます。

最初の文には、(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *と記述して、各単語を独自のグループに入れることができますが、これは、文の単語数を知っていることを前提としています。

任意の文の各単語を独自のグループに入れる正規表現を書くことは可能ですか?(?:(\ w *)\ s *)*のように(\ w *)の各インスタンスをグループ化できると便利ですが、それは機能しません。

私はPythonでこれを行っていますが、私のユースケースは明らかに「The quick brown fox」よりも少し複雑なので、正規表現でこれを1行で実行できれば便利ですが、それが不可能な場合は、次善の策を想定します。解決策は、re.findall()などを使用してすべての一致をループすることです。

あなたが持っているかもしれない洞察に感謝します。

編集:完全を期すために、これが私の実際のユースケースと、あなたの助けを借りてそれをどのように解決したかです。再度、感謝します。

>>> s = '1 0 5 test1 5 test2 5 test3 5 test4 5 test5'
>>> s = re.match(r'^\d+\s\d+\s?(.*)', s).group(1)
>>> print s
5 test1 5 test2 5 test3 5 test4 5 test5
>>> list = re.findall(r'\d+\s(\w+)', s)
>>> print list
['test1', 'test2', 'test3', 'test4', 'test5']
4

4 に答える 4

6

モジュールreで関数findallを使用することもできます。

import re
>>> re.findall("\w+", "The quick brown fox")
['The', 'quick', 'brown', 'fox']
于 2010-07-08T03:25:17.853 に答える
4

それが可能だとは思いません。Regexesは、指定された正規表現の括弧とキャプチャをペアにします...'((\ w +)\ s +){0,99}'のように1つのグループのみをリストした場合、最初に同じものに繰り返しキャプチャし、 2番目のグループ...見つかった一致ごとに新しいグループを作成しません。

splitを使用することもできますが、それは1つの文字値でのみ分割され、空白のような文字のクラスでは分割されません。

代わりに、正規表現で分割できるre.splitを使用して、任意の空白に一致するように「\s」を付けることができます。空白を貪欲に集めるには、おそらく「\s+」と一致させる必要があります。

>>> import re
>>> help(re.split)
Help on function split in module re:

split(pattern, string, maxsplit=0)
    Split the source string by the occurrences of the pattern,
    returning a list containing the resulting substrings.

>>> re.split('\s+', 'The   quick brown\t fox')
['The', 'quick', 'brown', 'fox']
>>>
于 2010-07-08T03:23:42.243 に答える
3

string.split同じことをするのになぜ正規表現を使うのですか?

>>> "The quick brown fox".split()
['The', 'quick', 'brown', 'fox']
于 2010-07-08T03:19:55.340 に答える
1

正規表現は、不明な数のグループにグループ化することはできません。しかし、あなたの場合には希望があります。'split'メソッドを調べてください。あなたの場合に役立つはずです。

于 2010-07-08T03:21:10.030 に答える