LoginSignup
0
0

More than 1 year has passed since last update.

IQ Botのカスタムロジック:数値だけ/英数字だけを取り出す

Last updated at Posted at 2020-04-06

IQ Botのカスタムロジックで、シンプルな置換処理の次くらいによく使うのが、「読み取った値の数値部分だけを取り出す」という処理です。

数値だけ取り出す処理

他の処理と同様、こちらもフィールド項目の場合とテーブル項目の場合でやりかたが違います。

フィールド項目の場合

フィールド項目の場合
import re
field_value = re.sub("\\D", "", field_value)

"\\D"の部分が、正規表現で「数値以外の文字」を表します。
つまり「数値以外の文字が混じっていたら、一律除外してください」という処理です。

なお、上記のコードをIQ Botのカスタムロジックにコピペすると、
バックスラッシュ()で表示されている部分が円マーク(¥)になると思います。

両者はただのフォントの違いで同じ意味なので、どちらでも問題なく動きます。

テーブル項目の場合

上記と同じことをテーブル項目に対してやる場合は、以下の要領で行います。

テーブル項目の場合
df['列名'] = df['列名'].str.replace("\\D", "")

テーブル項目に対して処理を行う場合は、
最初と最後におまじないコードを入れるのを忘れないように!

テーブル項目の列名についてはこちらを参照。

数値だけ取り出す処理の使い道

数値だけ取り出す処理の使い道は、主に2つです。
業務で使う割合でいうと、前者が2割:後者が8割くらいでしょうか(扱っている帳票によると思いますが)。

文章やラベルとくっついている読み取り結果から、数値部分だけを取り出す

合計金額などの数値項目が帳票上に「今月の請求金額は123,456円となります」みたいに文章で表記されている場合や、
銀行名~支店名~口座番号がずらっと並んだ中から口座番号だけを取り出したい場合などに使います。

数値項目から予測不能なノイズを除外

こちらの記事で置換を使ったノイズの除外について説明していますが、
実業務では、どういう形でノイズが混入してくるか予測がつかないケースがほとんどだと思います。

「この項目には数値しか入って来ない」とあらかじめわかっている場合は、
「数値以外の文字が混入していたら一律除外」というこの処理を使っておくと効率がいいです。

その際、当たり前ですが、ゼロをオーと読んでしまう・イチをI(アイ)やl(エル)と呼んでしまうなどのパターンが決まった誤読についてはあらかじめ処理をしてからこの処理をかけましょう。

実際の使用例(フィールド項目の場合)

#パターンの決まった誤読にまず対処

#Replace アイ、エル、パイプラインを1に
field_value = field_value.replace("I","1")
field_value = field_value.replace("l","1")
field_value = field_value.replace("|","1")

#Replace オーと〇をゼロに
field_value = field_value.replace("O","0")
field_value = field_value.replace("〇","0")

#その上で、数値以外の文字を除外

import re
field_value = re.sub("\\D", "", field_value)

応用編

正規表現を使った表現で、数字以外にもさまざまな条件で抽出したい文字の種類を指定できます。

フィールド項目の場合は、各処理の前に import re を置く必要がありますが、テーブル項目の場合は不要です。

数字+英字(大文字)だけを残したいとき

フィールド項目の場合
field_value = re.sub(r"[^0-9A-Z]","",field_value)

テーブル項目の場合
df['列名'] = df['列名'].str.replace(r"[^0-9A-Z]", "")

数字+英字(大文字、小文字両方)を残したいとき

フィールド項目の場合
field_value = re.sub(r"[^0-9a-zA-Z]","",field_value)

テーブル項目の場合
df['列名'] = df['列名'].str.replace(r"[^0-9a-zA-Z]", "")

数字+小数点だけを残したいとき

フィールド項目の場合
field_value = re.sub(r"[^.0-9]","",field_value)

テーブル項目の場合
df['列名'] = df['列名'].str.replace(r"[^.0-9]", "")

より複雑なパターンの抽出

(例)血液型の後に、2桁-4桁-4桁の数字が続く文字列を抽出(フィールド項目の場合)
import re
mobj = re.search(r"(A|B|O|AB)型[0-9]{2}-[0-9]{4}-[0-9]{4}",field_value)   
field_value = mobj.group(0)

検索用:数字のみ/数値のみ/数字だけ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0