2

文字列内のどこかでXYZに続くABCの出現に一致する正規表現を書き込もうとしています:

元。text-「いくつかのABCテキスト、XYZ、複数のABC、より多くのABC、より多くのABC」

つまり、正規表現はXYZの後に来る3つのABCと一致する必要があります。

手がかりはありますか?

4

4 に答える 4

1

反復的なアプローチを取ることができます:

s = "Some ABC text followed by XYZ followed by multiple ABC, more ABC, more ABC"

pattern = re.compile(r'(?<=XYZ)(.*?)ABC')
while pattern.search(s):
   s = pattern.sub(r'\1REPLACED', s)

print s

出力:

一部のABCテキスト、XYZ、複数のREPLACED、より多くのREPLACED、より多くのREPLACED

于 2012-09-20T11:31:53.330 に答える
1

XYZ繰り返されるリテラルとグループを一致させるだけABCです:

r'XYZ((?:ABC)+)'

パターンはリテラル文字の(?:ABC)+セットと少なくとも1回一致し、グループ全体の前にリテラルXYZが付きます。

これは非常に基本的な正規表現101です。開始するには、正規表現のマッチングに関する優れたチュートリアルを読む必要があります。

于 2012-09-20T09:09:39.153 に答える
1

このようなもの?r"(?<=XYZ)((?:ABC)+)"ABCこれは、それらが続くときの出現にのみ一致しますが、それ自体XYZは含まれませんXYZ

編集

OPの元の質問を誤解したようです。これを行う最も簡単な方法は、最初に文字列を見つけることXYZです。の開始位置を保存しますXYZ。開始位置を。への追加の引数として使用しp.finditer(string, startpos)ます。これはコンパイルされた正規表現でのみ機能するため、最初にパターンをコンパイルする必要があることに注意してください。

必要なパターンは単純r"(ABC)"です。

または、を使用p.sub()して置換を行うこともできますが、これを文字列の一部でのみ機能させるには、最初に部分文字列を作成する必要があります。パラメータp.sub()はありません。startpos

于 2012-09-20T09:11:54.990 に答える
0

コレクションには、役立つ可能性のある気の利いたCounterオブジェクトがあります。Counterオブジェクトは、キーが個々のアイテムであり、値がカウントされる辞書です。例:

Counter('hello there hello'.split()) # {'hello':2, 'there', 1}

単語を数えたいので、空白が表示されている場所でフレーズを分割する必要があります。これは、splitメソッドのデフォルトの動作です。これは、Counterを使用するスクリプトの例です。下半分は、必要に応じて関数に適合させることができます。

from collections import Counter

def count_frequency(phrase):
    """ Return a dictionary with {word: num_of_occurences} """
    counts = Counter(phrase.split())
    return counts

def replace_word(target_word, replacement, phrase):
    """ Replaces *word* with *replacement* in string *phrase* """
    phrase = phrase.split()

    for count, word in enumerate(phrase):
        if word == target_word:
            phrase[count] = replacement

    return ''.join(phrase)

phrase = "hello there hello hello"
word_counts = count_frequency(phrase)
new_phrase = ''
replacement = 'replaced'

for word in word_counts:
    if word_counts[word] > 2:
        phrase = phrase.replace(word, replacement)

print(phrase)
于 2017-12-03T09:51:18.720 に答える