文字列内のどこかでXYZに続くABCの出現に一致する正規表現を書き込もうとしています:
元。text-「いくつかのABCテキスト、XYZ、複数のABC、より多くのABC、より多くのABC」
つまり、正規表現はXYZの後に来る3つのABCと一致する必要があります。
手がかりはありますか?
反復的なアプローチを取ることができます:
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
XYZ
繰り返されるリテラルとグループを一致させるだけABC
です:
r'XYZ((?:ABC)+)'
パターンはリテラル文字の(?:ABC)+
セットと少なくとも1回一致し、グループ全体の前にリテラルXYZが付きます。
これは非常に基本的な正規表現101です。開始するには、正規表現のマッチングに関する優れたチュートリアルを読む必要があります。
このようなもの?r"(?<=XYZ)((?:ABC)+)"
。ABC
これは、それらが続くときの出現にのみ一致しますが、それ自体XYZ
は含まれませんXYZ
。
編集
OPの元の質問を誤解したようです。これを行う最も簡単な方法は、最初に文字列を見つけることXYZ
です。の開始位置を保存しますXYZ
。開始位置を。への追加の引数として使用しp.finditer(string, startpos)
ます。これはコンパイルされた正規表現でのみ機能するため、最初にパターンをコンパイルする必要があることに注意してください。
必要なパターンは単純r"(ABC)"
です。
または、を使用p.sub()
して置換を行うこともできますが、これを文字列の一部でのみ機能させるには、最初に部分文字列を作成する必要があります。パラメータp.sub()
はありません。startpos
コレクションには、役立つ可能性のある気の利いた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)