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

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

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

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

Python

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

Q&A

解決済

2回答

961閲覧

正規表現:sub()によるマッチした部分の置換が出来ない

falcom_zx

総合スコア65

正規表現

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

Python

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

0グッド

0クリップ

投稿2021/01/05 13:54

行いたいこと
正規表現で定義した特定文字列を含む行を削除(""に置換)したい。

今の状況
定義した正規表現はsearch関数では正しく作動するので問題無いと思います。

python

1import re 2 3line1 = "$GAGSV,1,1,00,2*76" 4line2 = "$GBGSV,1,1,02,13,41,247,18,21,35,308,21,1*76" 5line3 = "$GNGGA,014106.00,3955.4429013,N,12312.0688793,E,2,08,4.36,49.675,M,28.378,M,1.0,0000*5B" 6line4 = "$GNGLL,3955.4429013,N,12312.0688793,E,014106.00,A,D*71" 7 8linelist = [line1,line2,line3,line4] 9 10pattern = re.compile(r'^(?!.*(,N,)).*$') 11 12for i in linelist: 13 print(bool(pattern.search(i))) 14 15# 出力は狙い通り 16# line1 -> True 17# line2 -> True 18# line3 -> False 19# line4 -> False

しかし、sub関数が出力イメージ通りにならず、全く削除されません。

python

1csvtext = line1 + "\n" + line2 + "\n" + line3 + "\n" + line4 2 3t = re.sub(pattern,"",csvtext) 4print(t) 5 6# 出力結果 7# $GAGSV,1,1,00,2*76 8# $GBGSV,1,1,02,13,41,247,18,21,35,308,21,1*76 9# $GNGGA,014106.00,3955.4429013,N,12312.0688793,E,2,08,4.36,49.675,M,28.378,M,1.0,0000*5B 10# $GNGLL,3955.4429013,N,12312.0688793,E,014106.00,A,D*71 11 12# 出力イメージ(行いたい出力) 13# (削除) 14# (削除) 15# $GNGGA,014106.00,3955.4429013,N,12312.0688793,E,2,08,4.36,49.675,M,28.378,M,1.0,0000*5B 16# $GNGLL,3955.4429013,N,12312.0688793,E,014106.00,A,D*71

色々調べたのですが、八方塞がりです。ご教授お願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

1行ずつ処理するなら、提示されたpatternそのままで置換できます。

しかし、re.subの対象は複数行テキストで、$をそれぞれの行末にマッチさせる必要があるので、MULTILINEモードのパターンにする必要があります。

Diff

1-pattern = re.compile(r'^(?!.*(,N,)).*$') 2+pattern = re.compile(r'^(?!.*(,N,)).*$', re.MULTILINE)

投稿2021/01/05 14:17

Daregada

総合スコア11990

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

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

falcom_zx

2021/01/05 15:10 編集

出来ました!マルチラインモード知りませんでした。 丁寧な解説ありがとうございます。
guest

0

マッチしないからです。

python

1>>> print(pattern.search(csvtext)) 2None

なぜなら、全部つないでしまえば(,N,)というパターンはあるからです。

投稿2021/01/05 14:19

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問