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

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

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

923閲覧

Pythonで括弧内の記号だけ置換したい

KGS222

総合スコア1

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2023/01/27 10:49

前提

pythonを使用しています。
プログラミング自体初心者ですが、よろしくお願いします。

実現したいこと

文字列中の、括弧内の記号 ”," を ":" に置換したいです。
文字列中に現れる記号は , - = ( ) の5種類で、
()内に表示される記号は , のみです。
数値は0~99の範囲で表示されます。

文字列例 moji = "11(1,0,2)(2,2)(3,13)6-7=8" moji = "0-1-1=2(22,2)-(1,1,1,1)2" 実現された例 "11(1:0:2)(2:2)(3:13)6-7=8" "0-1-1=2(22:2)-(1:1:1:1)2"

試したこと

色々調べた結果、以下の正規表現を利用した方法を試しました。
しかし、()内の文字列を全て置換する方法しか分からず、
()内、かつ、記号のみを限定するまでには至りませんでした。

python

1re.sub(r'(?<=\().+?(?=\))',':',moji) 23'11(:)(:)(:)6-7=8' 4'0-1-1=2(:)-(:)2'

正規表現にて試しましたが、無理な場合は正規表現にはこだわらないです。

補足情報(FW/ツールのバージョンなど)

python 3.9.7

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/01/27 10:57

()の外に「,」が使われることはあるのですか?
KGS222

2023/01/27 13:01

あります。 また、()内に数字のみが入る事はありません。 追加となってしまいすみません。
TakaiY

2023/01/27 14:47

>正規表現にて試しましたが、無理な場合は正規表現にはこだわらない 回答付いてますが、こういう以外と面倒な置換は、一度にするのでなく、複数段階に分けて対応するのが決もです。 で、そういう抽出にはやはり正規表現が楽ですね。
guest

回答2

0

python

1import re 2 3# 文字列例 4moji = "11(1,0,2)(2,2)(3,13)6-7=8" 5moji2 = re.sub(r'\(.*?\)', lambda g: g.group(0).replace(',', ':'), moji) 6print(moji2) 7# 11(1:0:2)(2:2)(3:13)6-7=8 8 9moji = "0-1-1=2(22,2)-(1,1,1,1)2" 10moji2 = re.sub(r'\(.*?\)', lambda g: g.group(0).replace(',', ':'), moji) 11print(moji2) 12# 0-1-1=2(22:2)-(1:1:1:1)2

投稿2023/01/27 13:46

melian

総合スコア19805

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KGS222

2023/01/28 07:54

お早い回答ありがとうございます。 group(0)で、()内を指定してlambdaで置換処理を繰り返す、といった処理でしょうか。 group(0)を知らなかったので、正規表現で頑張り続けていました。 ありがとうございます。
guest

0

ベストアンサー

分かり易く書くとこんな感じで。

Python

1import re 2 3def foo(m): 4# 渡されたマッチした文字列内のカンマをコロンに置換 5 return m.group(0).replace(",",":") 6 7def bar(s): 8# 括弧とその中をマッチさせて、それをfooに渡して返り値で置換 9 return re.sub(r"\(.*?\)",foo,s) 10 11moji = "11(1,0,2),(2,2),(3,13)6-7=8" #括弧外にもカンマがあるケース 12print(moji) 13print(bar(moji)) 14 15moji = "0-1-1=2(22,2)-(1,1,1,1)2" 16print(moji) 17print(bar(moji))

投稿2023/01/27 13:38

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KGS222

2023/01/28 08:00

お早い解答ありがとうございます。 return re.sub(r"\(.*?\)",foo,s) 第二引数に関数(foo)が指定できるとは、知らなかったです。 やはり、コメントでも頂きましたが、二つに分けないといけないのですね。 ありがとうございます。
otn

2023/01/28 13:14 編集

正規表現を知るとなんでも1つの正規表現でやろうとして一目でわからないな正規表現になってしまう、あるいは、出来ないと言うことになります。単純な正規表現と言語側の機能を組み合わせてやれば簡単・簡明なケースが多いです。例えば、「~~を含まない」とか「~~~を含んで~~を含まない」だと言語側で論理演算子を使えば簡明です。 なお、分かり易くするため関数fooを定義しましたが、このような簡単な処理だと関数を定義せず、lambdaで直接書くのが普通です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問