re 〜正規表現を用いて検索・置換〜
用途
正規表現を用いて検索や置換を行うとき。
(私の場合、大量のデータに一括で置換処理を施したいときは、linuxコマンドsed
を使うことが多い。
少量のデータに一括で置換処理を施したいときは、経過が観やすいvimの:%s
を使うことが多い。)
インポート
import re
Pythonの標準モジュールなのでpip install
などをする必要はない。
置換を用いてツイートの正規化を行う例
要件
- ツイートから正規表現で特定の文字列を見つけ、置換したい。
- 置換対象の文字列と置換先の文字列は1対1対応で、複数ある。
- リプライ先のユーザ名 → 削除
- なんらかのURL→
<URL>
タグ - なんらかのユーザ名→
<NAME>
タグ - なんらかの数字→
<NAM>
タグ
- 1行1ツイートで保存されている
繰り返し同じパターンの検索を行うので、コンパイルを行うことにする。
import re # 置換対象と置換先の設定 patterns = [['^(@[a-zA-Z0-9_]+ )+', ''], ['https?://[¥w/:%#¥$¥?¥(¥)~¥.=¥+¥-]+]', '<URL>'], ['@[a-zA-Z0-9_]+', '<NAME>'], ['[0-9]+','<NUM>'] ] repatterns = [re.compile(pattern[-1]) for pattern in patterns] tweets = [] with open('tweets.list', 'r') as f: tweets = f.read().split('¥n')[:-1] new_tweets = [] for tweet in tweets: for (idx, repattern) in enumerate(repatter): tweet = repattern.sub(patterns[idx][1], tweet) new_tweets.append(tweet)
検索を用いてMeCab出力結果から特定の品詞の単語表層系のみ抜き出す例
mecabの出力結果を与えると、特定の品詞の単語だけ抜き出した分かち書き文に変換してくれるプログラム。
要件
繰り返し同じパターンの検索を行うので、コンパイルを行うことにする。
import re # 抜き出す対象の設定 patterns = ['^名詞,', '^形容詞, '] repatterns = [re.compile(pattern) for pattern in patterns] mecabouts = [] with open('tweets.list', 'r') as f: mecabouts = [x.split('¥t') for x in f.read().split('¥n')[:-1]] wordstrings = [''] for mecabout in mecabouts: if len(mecabout)==2: surface, pos = mecabout[0], mecabout[1] if len([1 for repattern in repatterns if repattern.search(pos)])>0: wordstrings[-1] = wordstrings[-1] + surface + ' ' else: #EOS if len(wordstrings[-1])>0: wordstrings[-1] = wordstrings[-1][:-1] #末尾の空白を削除 wordstrings.append('') wordstrings = wordstrings[:-1]
参考
- Pythonの簡単な調べ物の際に、度々お世話になるところ 正規表現に関する情報 | note.nkmk.me
- 分かりやすいpythonの正規表現の例 - Qiita
- URLなど様々な様式にマッチする正規表現の例がのってる よく使う正規表現はもうググりたくない! - Qiita