メモ書き:正規表現とか(re)

以前にこんな感じのやつ書こうと思ったのに消した気がするので書き直しましゅ

正規表現についてはGoogle先生に聞いてください、できたら後でまとめておいてください。それから冷たい水をください、できたら愛してください。
それよりもreについてもう少しまとめてください。この記事は完成してません。使うときに増やしておいてね。マッチオブジェクトについて詳しく書いておいて下さいどうせ私は忘れるので。

そもそも正規表現って何?

  • 文字のパターンのものを持ってきたいときに使われるもの。
  • 複数の文字列を、通常文字列リテラルとメタ文字を用いた一つの形式で表現することができる

基本的に正規表現は最長一致するようになっている。最短一致させたいときは注意すること。

表現

数字

[0-9]

任意の一文字

.

繰り返し

0回以上の繰り返し
*
1回以上の繰り返し
+
m〜n回の繰り返し
{m,n}

( )

( )で括るとカッコ内をひとまとまりとして認識してくれる。
例えば

Tit for T(aa)*t!

と入力すると、

Tit for Taaaat!
Tit for Taaaaaaaat!
Tit for Tt!

が該当する。要するに、aaのまとまりが0回以上発生していれば該当する。

Tit for Tat!

は該当しない……はず。したらごめんなさい。

というかこのサイト見たほうが早い

murashun.jp

re.何某()と使い方

match

文字列の先頭がマッチするかチェックする。マッチするならマッチオブジェクトが返ってくる。

import re
s = "「死の雨」によって滅びた王国「果ての国」を舞台に、少女リリィと不死の騎士達の物語が始まります。悲劇的で美しい世界を探索しながら、一瞬の気の緩みが命取りになるような強敵との戦闘を繰り広げる横スクロールアクションRPGです。仲間たちと共に世界の真相へ辿り着いて下さい。"
c = re.match(r"「.+?」", s)
print(c)
<_sre.SRE_Match object; span=(0, 5), match='「死の雨」'>

先頭だけなので先頭にないものだとこうなる。

import re
import re
s = "「死の雨」によって滅びた王国「果ての国」を舞台に、少女リリィと不死の騎士達の物語が始まります。悲劇的で美しい世界を探索しながら、一瞬の気の緩みが命取りになるような強敵との戦闘を繰り広げる横スクロールアクションRPGです。仲間たちと共に世界の真相へ辿り着いて下さい。"
c = re.match(r"リリィ", s)
print(c)
None

先頭じゃなくてもOK。ただし、1つしか検索できない。

finditer

「いやいや、1つだけじゃなくて全部知りたいんだわ。」って時に使うやつ

findall

こっちの方が雑に手軽に使えるのでこっちを使っちゃってることが多い。いいのか悪いのかは分からない。マッチオブジェクトは返ってこない。

 s = "「死の雨」によって滅びた王国「果ての国」を舞台に、少女リリィと不死の騎士達の物語が始まります。悲劇的で美しい世界を探索しながら、一瞬の気の緩みが命取りになるような強敵との戦闘を繰り広げる横スクロールアクションRPGです。仲間たちと共に世界の真相へ辿り着いて下さい。"
c = re.findall(r"「.+?」", s)
print(c)
['「死の雨」', '「果ての国」']

sub

置換。削除にも使える。

s = "「死の雨」によって滅びた王国「果ての国」を舞台に、少女リリィと不死の騎士達の物語が始まります。悲劇的で美しい世界を探索しながら、一瞬の気の緩みが命取りになるような強敵との戦闘を繰り広げる横スクロールアクションRPGです。仲間たちと共に世界の真相へ辿り着いて下さい。"
c = re.sub(r"「.+?」","", s)
print(c)
によって滅びた王国を舞台に、少女リリィと不死の騎士達の物語が始まります。悲劇的で美しい世界を探索しながら、一瞬の気の緩みが命取りになるような強敵との戦闘を繰り広げる横スクロールアクションRPGです。仲間たちと共に世界の真相へ辿り着いて下さい。

countを使うことで最大置換回数を指定できる。

絵文字を消すやつ

参考元:
freeheroblog.com

def emoji_finder(text):
    import re
    emoji_pattern = re.compile("["
        u"\U0001F600-\U0001F64F"
        u"\U0001F300-\U0001F5FF"
        u"\U0001F680-\U0001F6FF"
        u"\U0001F1E0-\U0001F1FF"
        u"\U00002500-\U00002BEF"
        u"\U00002702-\U000027B0"
        u"\U00002702-\U000027B0"
        # u"\U000024C2-\U0001F251" # 日本語
        u"\U0001f926-\U0001f937"
        u"\U00010000-\U0010ffff"
        u"\u2640-\u2642"
        u"\u2600-\u2B55"
        u"\u200d"
        u"\u23cf"
        u"\u23e9"
        u"\u231a"
        u"\ufe0f"  # dingbats
        u"\u3030"
                    "]+", re.UNICODE)
    if re.findall(emoji_pattern, text):
        return True
    else:
        return False

後で書いておいてくださいシリーズ

  • マッチオブジェクトについて詳しく書いておいて下さい
  • re.split("@.+? ",text)[-1]

これなんだっけ?多分リスト化だったような気もする。