Pythonで正規表現:Unicodeの扱い

正規表現は元々ASCIIコードの文字列を念頭に置いた処理であったがUnicodeへの拡張がされている。

  • \d:これは任意の 10 進数字にマッチする。Unicodeへの拡張で半角数字、全角数字にマッチする。
>>> print(re.findall(r'\d+','2021年6月十五日'))
['2021', '6']

漢数字にはマッチしない。半角数字のみでは[0-9]の範囲指定、全角数字のみでは[0-9]の範囲指定を使う。

  • \D:これは\dの補集合にマッチする。
  • \w:英数字にマッチする。Unicodeへの拡張では殆んど全ての文字にマッチする。ひらがなのみにマッチさせるのは[あ-ん]を使う。カタカナは[ア-ン]を使う。
>>> print(re.findall(r'[あ-ん]+','雨ニモ負ケズ、風にも負けず'))
['にも', 'けず']
>>> print(re.findall(r'[ア-ン]+','雨ニモ負ケズ、風にも負けず'))
['ニモ', 'ケズ']

注)Unicode表に沿えばひらがなの範囲は[ぁ(小書きのあ)-ゖ(小書きのけ)]であるが伝統的にはひらがなは「あ」で始まり「ん」で終わるべきだ。

ひらがなカタカナをマッチングから外すには補集合表示が使える。

>>> print(re.findall(r'[^あ-んア-ン]+','雨ニモ負ケズ、風にも負けず'))
['雨', '負', '、風', '負']
  • \W:これは\wの補集合にマッチする。
  • 小さい「っ」・大きい「つ」の区別
>>> print(re.findall(r'.っ','はっきり、つめる'))
['はっ']
>>> print(re.findall(r'.つ','はっきり、つめる'))
['、つ']
  • 全角空白・半角空白
>>> print(re.findall(r' .','これは 全角、これは 半角'))
[' 半']
>>> print(re.findall(r' .','これは 全角、これは 半角'))
['\u3000全']
  • 句読点
>>> print(re.findall(r'.。|.、','おお、寒い。'))
['お、', 'い。']

以上、Unicodeの扱いを纏めてみた。