1

このアプローチを改善する方法について何かアイデアはありますか?

アイデアは、結合ハイフンを維持することですが、それらがスタンドアロンの場合は削除します。サンプル出力が表示されます

def de_punctuate(xs):
    reg = re.findall(r"[\w'-]+", xs)
    #the pupose of `fun` is to only remove any hyphens that stand alone.
    #i want to keep hyphens-as-joining
    fun = functools.partial(operator.ne, '-')
    return filter(fun, reg)

def no_numbers(xs):
    isa = functools.partial(operator.contains, string.digits)
    fn = lambda x: ''.join(itertools.filterfalse(isa, x))
    return list(filter(fn, xs))

for d in data:
    print(d)
    print(no_numbers(de_punctuate(d)))

出力例:

Turistguide fikk 40.000 kroner i bot for smugling
['Turistguide', 'fikk', 'kroner', 'i', 'bot', 'for', 'smugling']

- Må kalles opp etter Dale Oen
['Må', 'kalles', 'opp', 'etter', 'Dale', 'Oen']

Kvinne skadet i MC-ulykke ved Haugastøl
['Kvinne', 'skadet', 'i', 'MC-ulykke', 'ved', 'Haugastøl']

出力は私が望む方法です。しかし、私は、改善された正規表現が役立つよりも感じています!

これは少しきれいに見えると思います:

def de_punctuate(xs):
    return re.findall(r"[\w']+(?:-[\w']+)*", xs)

def no_numbers(xs):
    return [ x for x in xs if not re.search(r'[0-9]', x) ]
4

3 に答える 3

3

次のようなものを試してください。

re.findall(r"[\w']+(?:-[\w']+)*", myString)

にとって

myString = "walk-the-dog can - i - --have -- a- -- look at your pocket-book?"

これにより、次のようになります。

['walk-the-dog', 'can', 'i', 'have', 'a', 'look', 'at', 'your', 'pocket-book']
于 2012-07-14T00:20:13.253 に答える
2

functools はあまり使わないので、リスト内包表記で書いてみました。
1 つの行は、1 つのパスですべての数字を含む単一ハイフンとトークンを検索します。

[x for x in your_string.split() if x != '-' and not re.search(r'[0-9]', x)]

両方の数字、独立したハイフン、および単語の途中のハイフンを含む例で使用します。

>>> def foo(your_string):
...     return [x for x in your_string.split() if x != '-' and not re.search(r'[0-9]', x)]
...
>>> your_string = 'Turistguide fikk 40.000 kroner i - bot for smugling MC-ulykke'
>>> foo(your_string)
['Turistguide', 'fikk', 'kroner', 'i', 'bot', 'for', 'smugling', 'MC-ulykke']

複数のハイフンのスタンドアロン実行を処理する必要がある場合は、最初の条件をif簡単に変更できます。

于 2012-07-14T00:22:46.483 に答える
0

試すreg = re.findall(r"[a-zA-Z0-9']+-*[a-zA-Z0-9']*", xs)

list()ところで、 aroundのfilter()呼び出しは必要ありませんno_numbers()

于 2012-07-14T00:53:16.840 に答える