2

したがって、「中国銀行」、「中国大使館」、「国際中国」などの文字列を使用できます。

「の」または「の」がある場合を除いて、すべての国のインスタンスを置き換えたい

明らかにこれは、国のリストを反復処理し、名前に国が含まれているかどうかを確認し、次に国「の」または「の」の前に存在するかどうかを確認することで実行できます。

これらが存在する場合、国は削除されません。存在しない場合、国は削除されます。例は次のようになります。

「中国銀行」または「中国大使館」、「国際」

ただし、国のリストが大きく、置換対象のテキストのリストが大きい場合は特に、反復が遅くなる可能性があります。

文字列を置き換えるより高速で条件に基づいた方法はありますか? Python re ライブラリを使用して単純なパターン マッチを引き続き使用できるようにするには?

私の機能は次のとおりです。

def removeCountry(name):
    for country in countries:
        if country in name:
            if 'of ' + country in name:
                return name
            if 'of the ' + country in name:
                return name
            else:
                name =  re.sub(country + '$', '', name).strip()
                return name
    return name

編集:ここでいくつかの情報を見つけました。これは if の実行方法を説明していますが、if not 'of ' if not 'of the ' then replace が本当に必要です...

4

4 に答える 4

0

このre.sub関数は、置換テキストとして関数を受け入れます。この関数は、指定された一致で置換する必要があるテキストを取得するために呼び出されます。だからあなたはこれを行うことができます:

import re

def make_regex(countries):
    escaped = (re.escape(country) for country in countries)
    states = '|'.join(escaped)
    return re.compile(r'\s+(of(\sthe)?\s)?(?P<state>{})'.format(states))

def remove_name(match):
    name = match.group()
    if name.lstrip().startswith('of'):
        return name
    else:
        return name.replace(match.group('state'), '').strip()

regex = make_regex(['China', 'Italy', 'America'])
regex.sub(remove_name, 'Embassy of China, International Italy').strip()
# result: 'Embassy of China, International'

結果には偽のスペースが含まれている可能性があります (上記の場合、ラストstrip()が必要です)。正規表現を次のように変更することで、これを修正できます。

\s*(of(\sthe)?\s)?(?P<state>({}))

of国名の前または前のスペースをキャッチし、出力での不適切なスペースを回避します。

このソリューションは、フォームのテキストだけでなく、テキスト全体を処理できることに注意してSomething of CountryくださいSomething Country。例えば:

In [38]: regex = make_regex(['China'])
    ...: text = '''This is more complex than just "Embassy of China" and "International China"'''

In [39]: regex.sub(remove_name, text)
Out[39]: 'This is more complex than just "Embassy of China" and "International"'

他の使用例:

In [33]: countries = [
    ...:     'China', 'India', 'Denmark', 'New York', 'Guatemala', 'Sudan',
    ...:     'France', 'Italy', 'Australia', 'New Zealand', 'Brazil', 
    ...:     'Canada', 'Japan', 'Vietnam', 'Middle-Earth', 'Russia',
    ...:     'Spain', 'Portugal', 'Argentina', 'San Marino'
    ...: ]

In [34]: template = 'Embassy of {0}, International {0}, Language of {0} is {0}, Government of {0}, {0} capital, Something {0} and something of the {0}.'

In [35]: text = 100 * '\n'.join(template.format(c) for c in countries)

In [36]: regex = make_regex(countries)
    ...: result = regex.sub(remove_name, text)

In [37]: result[:150]
Out[37]: 'Embassy of China, International, Language of China is, Government of China, capital, Something and something of the China.\nEmbassy of India, Internati'
于 2014-02-13T23:03:22.247 に答える
0

未検証:

def removeCountry(name):
    for country in countries:
          name =  re.sub('(?<!of (the )?)' + country + '$', '', name).strip()

否定後読み re.sub を使用すると、国の前に of または of がない場合にのみ一致して置換されます。

于 2014-02-14T01:39:41.500 に答える