25

タイプミスをキャプチャするための簡単な関数を作成しようとしています。例:

"Westminister15"
"Westminister15London"
"23Westminister15London"

固定後:

["Westminister", "15"]
["Westminister", "15", "London"]
["23", "Westminister", "15", "London"]

最初の試み:

 def fixate(query):
     digit_pattern = re.compile(r'\D')
     alpha_pattern = re.compile(r'\d')
     digits = filter(None, digit_pattern.split(query))
     alphas = filter(None, alpha_pattern.split(query))
     print digits
     print alphas

結果:

 fixate("Westminister15London")

 > ['15']
 > ['Westminister', 'London']

ただし、これはより効果的に実行できると思います。次のようなことを試してみると、それでも悪い結果が得られます。

 fixate("Westminister15London England")

 > ['15']
 > ['Westminister', 'London England']

明らかに、それは個別Londonに参加する必要がありEnglandますが、私の関数は過度にパッチが適用され、より単純なアプローチがあると感じています

この質問は、このphpの質問と多少同等です。

4

3 に答える 3

27

問題は、Pythonがre.split()長さゼロの一致で分割されないことです。しかし、あなたは次の方法で望ましい結果を得ることができますre.findall()

>>> re.findall(r"[^\W\d_]+|\d+", "23Westminister15London")
['23', 'Westminister', '15', 'London']
>>> re.findall(r"[^\W\d_]+|\d+", "Westminister15London England")
['Westminister', '15', 'London', 'England']

\d+任意の桁数に[^\W\d_]+一致し、任意の単語に一致します。

于 2012-09-13T15:40:10.977 に答える
12

正規表現を避けたい場合の別のアプローチを次に示します。正規表現を作成/変更するのに十分な知識がない場合は、扱いにくい場合があります。

from itertools import groupby

def split_text(s):
    for k, g in groupby(s, str.isalpha):
        yield ''.join(g)

print(list(split_text("Westminister15")))
print(list(split_text("Westminister15London")))
print(list(split_text("23Westminister15London")))
print(list(split_text("Westminister15London England")))

戻り値:

['Westminister', '15']
['Westminister', '15', 'London']
['23', 'Westminister', '15', 'London']
['Westminister', '15', 'London', ' ', 'England']

ジェネレーターも簡単に変更できるため、必要に応じて空白文字列を生成することはありません。

于 2012-09-13T16:56:12.020 に答える
5

代わりにこの正規表現を使用できます。

>>> import re
>>> regex = re.compile(r'(\d+|\s+)')
>>> regex.split('Westminister15')
['Westminister', '15', '']
>>> regex.split('Westminister15London England')
['Westminister', '15', 'London', ' ', 'England']
>>> 

次に、リストをフィルタリングして、空の文字列/空白のみの文字列を削除する必要があります。

于 2012-09-13T15:40:57.283 に答える