-3

Python 2.7 を使用しています。

単語を合わせながら*との違いを知りたいです。.*

以下はpythonのコードです

exp = r'.*c' #here is the expression
line = '''abc dfdfdc dfdfeoriec''' #the words I need to match 
re.findall(exp,line) #python expression

上記のコードからの出力は次のとおりです。

['abc dfdfdc dfdfeoriec']

値を次のように変更expすると:

exp = r'*c'

...その後、実行時に次のエラーが発生します。

Traceback (most recent call last):   File "<stdin>", line 1, in
<module>   File "C:\Program
Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py",
line 177, in findall
    return _compile(pattern, flags).findall(string)   File "C:\Program Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py",
line 242, in _compile
    raise error, v # invalid expression error: nothing to repeat

ここに別のコードがあります

exp = r'c.*'
line1='''cdlfjd ceee cll'''
re.findall(exp,line1)

上記のコードからの出力は

['cdlfjd ceee cll']

値を次のように変更するexpと:

exp = r'c*'

そして実行すると、次の出力が得られます。

['c', '', '', '', '', '', '', 'c', '', '', '', '', 'c', '', '', '']

この動作を説明してください。

4

6 に答える 6

1

正規表現では、'x*' は 0 個以上の 'x' のシーケンスに一致します (x は何でもかまいません)。デフォルトでは、「*」は貪欲です。つまり、できるだけ多くの文字に一致させようとします。
また、「.」正規表現の文字は、任意の文字に一致します。

したがって、次の.*ことを意味します。任意の文字を含む長さ 0 以上のシーケンスに一致します。

あなたのパターンの説明

.*c: 任意の文字を含み、その後に文字 'c' が続く、可能な限り長いシーケンスに一致します。

*c: シーケンスで許可されているものを指定しなかった...おっと、可能な限り長いシーケンスに一致します。エラーがスローされました。

c.*: 文字「c」の後に任意の文字を含む可能な限り長いシーケンスが続くものと一致します。

c*:文字「c」のみを含む最長のシーケンスに一致します。可能な限り長いということは、「長さ 0」も意味することに注意してください (そのため、これらの空の文字列が得られます)。


正規表現についてさらに読むには、次のリンクが役立ちます。

于 2013-06-19T07:25:12.763 に答える
0

*単に、その前の文字が 0 から何度でも一致できることを意味します。したがって、*c機能しません。しかし、またはまたは:)とc*一致しますが、任意の1文字に一致することを意味します。任意の文字の任意のシーケンスに一致することを意味します。cccccc.....*

正規表現の紹介を読むことを検討する必要があるかもしれません!

于 2013-06-19T07:17:58.753 に答える
0

*左の一致の 0 個以上を意味する演算子です。

.何にでも一致することを意味する演算子です。

c*0個以上のcに一致することを意味します

.*cは、0 個以上の任意のものに一致し、次に c.

于 2013-06-19T07:18:27.867 に答える