• ベストアンサー

文字列置換について

4901777␣品名A␣規格A␣日付␣␣␣␣␣6280␣␣␣␣7780 4901879␣品名B␣規格B␣日付␣␣␣␣␣6887␣␣␣␣9856 のような文字列があります。 【品名】と【規格】の間の半角空白を置換し 4901777␣品名規格␣日付␣␣␣␣␣6280␣␣␣␣7780 のように置換したいのですが正規表現ではどのように表したらいいでしょうか? ・【品名】と【規格】は全て大文字 ・【品名】と【規格】の箇所は文字列の始まり文字は不確定

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.4

(回答No.3の続きになりますが) もう少し考えてみると、「第二項目の後ろのスペースを削除」でも良いですね。 そうすると 検索パターン: ^(\S+\s\S+)\s 置換パターン: \1 でも良いことになります。 で、質問カテゴリがPythonですので、Pythonの正規表現置換を使うとすると、 import re をしておいて、変数 line に 取り込んだ一行が入っている場合、 line = re.sub('^(\S+\s\S+)\s', '\1', line) といった感じになるでしょう。

その他の回答 (3)

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.3

正規表現をどの言語・ツール・アプリで使うかによっても多少書き方が違ってくるのですが。 -- 行の先頭に数字列がある、ってことでいいでしょうか。 任意個の数字というのは、「[0-9]+」と表現できます。[0-9] は専用の \d (decimalのd) という表現がありますので、「\d+」と書いても同じです。 >・【品名】と【規格】は全て大文字 これらがそれぞれ、「任意の英大文字が任意個数(1個以上)続いているもの」であれば、「[A-Z]+」と表現できます。 もし数字も含まれるなら、「[A-Z0-9]+」と書く表現もあります。 そして「空白類」を表す「\s (space)」という表現もあります。(「空白「類」」なので、\sはスペース以外にもタブ文字・改行文字も含むのですが) 頭の数字と品名・規格の間が必ずスペース1個であれば「\s」単独でいいですし、1個以上任意個になる可能性があるならば「\s+」と書いてもいいです。 そして置換時に使える表現として、マッチするパターンの一部を ( ) でくくっておくと、置換後の文字列で \1 として参照できます。カッコの組が複数ある場合には、左から \1 \2 \3…として参照できます。 あと説明が必要なのは、パターン先頭の「^」。これは、行の先頭を表します。(これが無い場合、パターンは行の途中にもマッチします) ここまで説明したところで、以下のパターンが考えられます。 検索パターン: ^([0-9]+\s[A-Z]+)\s([A-Z]+) 置換パターン: \1\2 SEDのコマンドで書けば「s/^([0-9]+\s[A-Z]+)\s([A-Z]+)/\1\2/」となります。 検索文字列でマッチしなかった部分はそのまま残るので、行の後半はノータッチで構いません。 ---- 一つ懸念点があるとすれば、「本当に【品名】と【規格】は英大文字(または英大文字+数字)のみで構成されているか?」ということです。 もし、ハイフンやピリオドなど、記号が含まれたり、誤って英小文字が含まれたりすれば、その行に関しては置換が働かず、空白が詰まらない、という事故も発生しえます。 そう考えるといっそのこと、「区切りの空白」と「それ以外」と考え、「第二項目と第三項目を結合する」というパターンを作ることもできます。 「空白以外」という正規表現は「\S」(\sの逆)。それが1個以上続いてるならば「\S+」。 行の先頭から、空白以外1・空白・空白以外2・空白・空白以外3、とあるモノを、空白以外1・空白・空白以外2・空白以外3、に置換するとすれば、 検索パターン: ^(\S+\s\S+)\s(\S+) 置換パターン: \1\2 これでも良いことになります。

回答No.2

検索する文字列を 品名*␣規格* 置換後の文字列を 品名規格 これで置換できませんか?

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

A1セルに置換前の文字列がある場合の式として、以下の式でいかがでしょう。 =LEFT(A1,FIND("品名",A1)+1)&MID(A1,FIND("規格",A1),1000)