2

入力文字列内の特定の文字列値の出現を見つけるために、python の re.findall メソッドを使用しています。たとえば、「ABCdef」文字列での検索から、2 つの検索要件があります。

  1. 単一大文字から始まる文字列を検索します。
  2. 1 の後に、すべて大文字を含む文字列を見つけます。

たとえば、入力文字列と予想される出力は次のようになります。

  • 'USA' -- output: ['USA']
  • 'BObama' -- output: ['B', 'Obama']
  • 'Institute20CSE' -- output: ['Institute', '20', 'CSE']

だから私の期待

>>> matched_value_list = re.findall ( '[A-Z][a-z]+|[A-Z]+' , 'ABCdef' )

返品すること['AB', 'Cdef']です。

しかし、これは起こっていないようです。私が得るのは['ABC']、正規表現の後半部分と完全な文字列に一致する戻り値です。

見つかった一致を無視できる方法はありますか。したがって、 once'Cdef'は と一致し'[A-Z][a-z]+'ます。正規表現の 2 番目の部分 (つまり'[A-Z]+') は、残りの文字列とのみ一致します'AB'か?

4

2 に答える 2

5

最初に を一致させる必要がありAB、その後に大文字のアルファベット、次に小文字のアルファベットが続きます。または文字列の末尾にあります。そのためには、 を使用できますlook-ahead

C次に、大文字のアルファベットと、それに続く複数の小文字のアルファベットを一致させる必要がありますdef

したがって、次のパターンを使用できます。

>>> s = "ABCdef"
>>> re.findall("([A-Z]+(?=[A-Z][a-z]|$)|[A-Z][a-z]+)", s)
['AB', 'Cdef']

>>> re.findall("([A-Z]+(?=[A-Z][a-z]|$)|[A-Z][a-z]+)", 'MumABXYZCdefXYZAbc')
['Mum', 'ABXYZ', 'Cdef', 'XYZ', 'Abc']

@sotapme のコメントで指摘されているように、上記の正規表現を次のように変更することもできます。

"([A-Z]+(?=[A-Z]|$)|[A-Z][a-z]+|\d+)"

\d+あなたの例のように数字も一致させたいので追加しました。[a-z]また、彼は先読みの最初の部分から一部を削除しました。これ+は、外側の量指定子が[A-Z]デフォルトで貪欲であるため、自動的に最大文字列に一致し、最後のupper caseアルファベットの前でのみ停止するため、機能します。

于 2013-02-09T12:51:23.910 に答える
1

この正規表現を使用できます

[A-Z][a-zA-Z]*?(?=[A-Z][a-z]|[^a-zA-Z]|$)
于 2013-02-09T12:51:12.343 に答える