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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

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

Q&A

3回答

219閲覧

正規表現(Python)

Villager

総合スコア12

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

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

0グッド

1クリップ

投稿2018/01/17 11:55

現在、Python3.6(reモジュール使用)を用いて正規表現でファイル内にある2字の英単語"のみ"を抽出したいと考えています。

Perlであれば、

\b[A-Z][A-Z]\b

で抽出できることはわかったのですが、Pythonではうまくはいきません。
Pythonであればどのようにすれば抽出できるのでしょうか。

###正規表現で抽出したいファイル例

BURUNDI BI BDI 108 3166-2 CAMBODIA KH KHM 116 3166-2 CAMEROON CM CMR 120 3166-2

###なってほしい結果

BI KH CM

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

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

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

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

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

quickquip

2018/01/17 12:18

`\b`はPythonにも**あります**から、うまくいかないなら書き方が悪いだけでしょう。ソースを提示するべきです。
guest

回答3

0

python

1a = "BURUNDI BI BDI 108 3166-2" 2print(re.findall("\b[A-Z][A-Z]\b", a))

投稿2018/01/17 12:17

KojiDoi

総合スコア13671

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

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

0

\bは文字列の先頭、末尾も含めてマッチしますので・・・

think49さんがおっしゃるように単に正規表現の指定でのバックスラッシュのエスケープを正しく指定するという問題のように思います。

KojiDoiさん回答にあるように正規表現を文字列定数として指定するならバックスラッシュをエスケープして'\b'のように記述しなければなりません。

Pythonに限らず正規表現の仕様にある\bというようなパターンはバックスラッシュ文字\bの2文字であることに注意が必要です。Pythonで文字列定数を記述する際に'\b'だとバックスペース文字と解釈されてしまい全然別の意味になります。

###別解
正規表現やWindowsのパス文字列に含まれるバックスラッシュ文字を一々エスケープするわずらわしさを解消する便利な記法としてPythonではr'...'という記法があるようです。こちらの方がお奨めかもです。(2.7でも3.6でも使えるようでした)

Python

1import re 2 3for s in re.findall(r'\b[A-Z]{2}\b', 'AB CDE FG HIJ KL'): 4 print(s) 5 6===> 7AB 8FG 9KL

投稿2018/01/17 15:43

KSwordOfHaste

総合スコア18394

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

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

0

\b

どのレベルの「単語」を求めているのか不明ですが、Pythonの単語は "alphanumeric characters" のようなので、それに倣うと仮定して、

\b
Word boundary. This is a zero-width assertion that matches only at the beginning or end of a word. A word is defined as a sequence of alphanumeric characters, so the end of a word is indicated by whitespace or a non-alphanumeric character.

\b を使わずに実現するとすれば、正規表現は下記になるでしょうか。

plain

1(?<![a-zA-Z\d])[A-Z]{2}(?![a-zA-Z\d])

(2018/01/17 23:42追記)

肯定先読み/後読みでは文字列の先端/終端にマッチしなかったので、否定先読み/後読みに変更しました。

エスケープシーケンス

文字列リテラルのエスケープシーケンスが考慮されていないだけのような気がしてきました。
先の正規表現を下記に変更して、期待通りに動作するなら、そういうこと(\ のエスケープが機能していない)ですね。

plain

1(?<![a-zA-Z0-9])[A-Z]{2}(?![a-zA-Z0-9])

Re: Villager さん

投稿2018/01/17 13:46

編集2018/01/17 14:42
think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問