🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
正規表現

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

1107閲覧

Python 正規表現

_eito_

総合スコア15

正規表現

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2019/12/11 15:08

編集2019/12/11 15:09

前提

3桁ごとにカンマで区切った数字にのみマッチするプログラムで思うようにいかなかったので質問させていただきました。下記の数字を参考にマッチする値だけ表示する正規表現を考えたのですがうまくいきませんでした。

マッチする 42 1,234 6,368,745 マッチしない 12,34,567 1234

該当のソースコード

python

1import re 2import pyperclip 3 4 5number_regex = re.compile(r'((\d,)?(\d,|\d{3},)?\d{1,3})') 6 7#クリップボードのテキスト検索する 8text = str(pyperclip.paste()) 9matches = [] 10for groups in number_regex.findall(text): 11 matches.append(groups[0]) 12 13#検索結果をクリップボードに貼り付ける 14if len(matches) > 0: 15 pyperclip.copy('\n'.join(matches)) 16 print('クリップボードにコピーしました') 17 print('\n'.join(matches)) 18else: 19 print('マッチする数字がありませんでした') 20

ターミナル上の表示

クリップボードにコピーしました 42 1,234 6,368,745 12 34 567 123 4

###実現したいこと

12 34 567 123 4

どのようにすれば上の数字を表示できなくすることができるでしょうか。ご教授頂けると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これでどうでしょう。

Python

1number_regex = re.compile(r'^\d{1,3}(?:,\d{3})*$', flags=re.MULTILINE)

#####_eito_さんの書いた正規表現

正規表現図

この正規表現だと、1,2,3とかもマッチしますね。

#####私の書いた正規表現

正規表現図

MULTILINEモードを活用して、行内で一回だけ判定を行うようにしています。


図はDebuggex: Online visual regex tester. JavaScript, Python, and PCRE.で作成

投稿2019/12/11 15:24

編集2019/12/11 15:32
LouiS0616

総合スコア35668

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

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

_eito_

2019/12/11 15:39

すみません、上記のコードを試してみたのですが、マッチする数字がありませんでした...
LouiS0616

2019/12/12 00:18

text = str(pyperclip.paste()) matches = number_regex.findall(text) だとどうなりますか。
_eito_

2019/12/12 09:04

同じくマッチする数字がありませんでした。
LouiS0616

2019/12/12 09:10

text = str(pyperclip.paste()) print(text) の実行結果を教えて下さい。
_eito_

2019/12/12 09:17

42 1,234 6,368,745 12,34,567 1234 1,2,3 という結果が出ました
_eito_

2019/12/12 09:18

一応 text = str(pyperclip.paste()) matches = [number_regex.findall(text)] print(matches) でも実行してみたのですがその時の結果は [[]] でした
LouiS0616

2019/12/12 09:28

re.MULTILINEは忘れず指定していますか?
_eito_

2019/12/12 09:46

指定しています
LouiS0616

2019/12/12 10:03

再現しました。pypertextが改行文字を\r\nにしているのが原因のようです。 どのように解決するのがスマートかちょっと検討しますので、少々お待ちください。
LouiS0616

2019/12/12 10:14

ちょっとダサいですけど、text = str(pyperclip.paste()).replace('\r\n', '\n') がどうやら正解です。
_eito_

2019/12/12 11:03

なぜかマッチする数字の先頭の部分しか取れませんでした。下記がターミナル上の表示です。 クリップボードにコピーしました 4 1 6
LouiS0616

2019/12/12 11:05

for groups in number_regex.findall(text): matches.append(groups[0]) を for groups in number_regex.findall(text): matches.append(groups) に修正して下さい。
LouiS0616

2019/12/12 11:07 編集

(?:...)を使うことで不必要なキャプチャを取らないよう工夫しているので、re.findallは単にマッチした文字列だけを返してくれます。
_eito_

2019/12/12 11:18

1つ1つの質問に丁寧に解説してくださり、本当にありがとうございました!おかげで解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問