質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

置換したい文字をより詳しく指定したい

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 1,094
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

置換したい文字をより詳しく指定したい。
今例えば、「さて、私鈴木太郎はこのたびテクノロジー株式会社代表取締役社長に選任され、去る
4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上
げます。」という文章がある。
この文章を、「さて、私〇〇〇〇はこのたび〇〇〇〇〇〇〇〇〇〇代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上
げます。」という文章に変換したい。

今回作りたいアルゴリズムは、私〜はの間の文字とこのたび〜代表取締役社長の間の文字を文字数だけ〇で置換できるものである。

 発生している問題・エラーメッセージ

理想の文章に変換できない。
エラーは出ていない。

 該当のソースコード

output = re.sub(r'鈴木太郎', '〇〇〇〇', text) 
print(output)


というコードを書いたがこれだと、指定の文字しか置換できない。
単語と単語の間の文字を置換する方法がないかお聞きしたい。

 試したこと

上記のコード

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

定型文なら下のようなコードで抜き出せるので、後処理でどうにでもなります。

>>> import re
>>> s = "さて、私鈴木太郎はこのたびテクノロジー株式会社代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。"
>>> re.search("さて、私.+?はこのたび", s)
<_sre.SRE_Match object; span=(0, 13), match='さて、私鈴木太郎はこのたび'>
>>> re.search("このたび.+?代表取締役社長に選任され", s)
<_sre.SRE_Match object; span=(9, 35), match='このたびテクノロジー株式会社代表取締役社長に選任され'>


一意に識別できる程度に余計なものを含めてmatchさせ、余計なものの文字数はわかってるので前後を適当に削れば望むもの(今回は人名と会社名の固有名詞)が得られます。あとは適当に置換してやるだけなので簡単な作業です。

 追記

せっかくなので最後までやってみました。

>>> name_match = re.search("さて、私.+?はこのたび", s).group()
>>> company_match = re.search("このたび.+?代表取締役社長に選任され", s).group()
>>> name_match
'さて、私鈴木太郎はこのたび'
>>> company_match
'このたびテクノロジー株式会社代表取締役社長に選任され'
>>> name_len = len(name_match)-9
>>> company_len = len(company_match)-16
>>> name_len
4
>>> company_len
10
>>> "さて、私{0}はこのたび{1}代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。".format("○"*name_len, "○"*company_len, )
'さて、私○○○○はこのたび○○○○○○○○○○代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。'

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/29 13:31

    回答をくださりありがとうございます。re.search("さて、私.+?はこのたび", s)からmatchした'さて、私鈴木太郎はこのたび'を取り出すにはどうしたら良いのでしょうか?よろしくお願いいたします。

    キャンセル

  • 2018/03/29 13:34

    re.searchの返り値は_sre.SRE_Match objectで、この.group()メソッドを呼ぶとマッチした文字列が返ります。

    キャンセル

  • 2018/03/29 14:42

    ありがとうございます。一番わかりやすかったのでベストアンサーにさせていただきました。とても勉強になりました。

    キャンセル

+3

正規表現の部分文字列置換を使うのが楽ではないでしょうか。

import re

txt       =  'さて、私田中一郎はこのたびテクノロジー株式会社代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。'
pattern_r =  'さて、私(.*?)はこのたび(.*?)株式会社代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。'
pattern_w = re.sub("\(\.\*\?\)", "{}", pattern_r)

subtxt  = re.search(pattern_r, txt).groups()
subtxt2 = ["○" * len(x) for x in subtxt]
print(pattern_w.format(*subtxt2)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

format関数というのを調べてみてください


また、正規表現というのも役に立つと思います
pythonは文字列操作に関してはいろいろ機能が揃っていますねー

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

あらかじめ置換しやすいテンプレートを作っておけばいいでしょう。

さて、私<name>はこのたび<org>代表取締役社長に選任され、去る
4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上
げます。

追記

質問を読み誤っていました。
置換前の文字数と同じ数だけの〇を入れるということですね。

text = 'さて、私田中一郎はこのたびテクノロジー株式会社代表取締役社長に選任され、去る4月3日付をもちまして就任いたしました。ここに謹んでご報告申し上げます。'
str = r'田中一郎'
re.sub(str, ''.ljust(len(str), '〇'), text)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/29 15:41

    こんなんぶっこまれても、おっさんしか気が付かん気がするwww

    キャンセル

  • 2018/03/29 15:42

    気が付かれたことにビビりましたw

    キャンセル

0

%sを使う方法

name1 = "foo"
org1 = "bar"
s = "%s - %s"
contents = s % (name1, org1)

.formatを使う方法

name1 = "foo"
org1 = "bar"
s = "{name} - {org}"
contents = s.format(name=name1, org=org1)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る