【備忘録】正規表現とreモジュール

スクレイピング
あくまで備忘録なんで雑に記録します

参考:図解!Python 正規表現の徹底解説!(文字列の抽出と置換など)

図解!Python 正規表現の徹底解説!(文字列の抽出と置換など)

re(Regular Expression:正規表現)モジュール

基本形:res = re.関数(正規表現,検索値)

ある文字列チェックを正規表現で該当するかどうかチェック

例:abcdefghijk に、efgはある、gheはない

※最長一致(デフォルトの貪欲マッチ:非貪欲にしたかったら[?]をつける

abcabcの文字列を、s「a .* b 」という正規表現でチェックした時に、該当するのは

abcabc←ではなく、

abcabc←こっち

正規表現

メタ文字を組み合わせた系式

メタ文字

文頭・・・^(ハット)
文尾・・・$
1文字・・・ . (ドット)
直前文字の0回以上の繰り返し・・・*
直前文字の1回以上の繰り返し・・・+
0文字以上の文字列・・・.*
1文字以上の文字列・・・.+

直前の文字のn回の繰り返し・・・{n}

文字選択肢・・・[ab@](a、もしくはb、もしくは@)/[0-9](0~9のいずれか)
文字選択肢複数・・・[a-c]+(a〜cの1文字以上)例:aca
not文字選択肢・・・[^abc]集合にハット(a、もしくはb、もしくはc以外):例z
文字列選択肢・・・a|b(a、もしくはb)/a(b|c)(aとb、もしくはc):例ac

エスケープ文字・・・「+」や「.(ドット)」を文字列として使いたい場合は「\」(エスケープ文字:Macはoption+¥)を前に入れる

その他、エスケープ文字があることで逆にメタ文字化してしまうもの
\d・・・数字 1 文字
\D・・・数字以外の 1 文字
\w・・・英数字または_ のうち 1 文字
\W・・・\w 以外の 1 文字
\n・・・改行文字
\t・・・タブ文字
\s・・・空白文字全般

reの使い方①特定文字列の有無(search)

# 「dog」という文字列を含むかどうか

import re

S1 = "bulldog"
S2 = "shibainu"
S3 = "hotdog"

reg = "dog"

print("Yes" if re.search(reg, S1) else "No")
>>>Yes
print("Yes" if re.search(reg, S2) else "No")
>>>No
print("Yes" if re.search(reg, S3) else "No")
>>>Yes

reの使い方②特定部分を抜き出したい(findall)

#!/usr/bin/python
# -*- coding: Shift-JIS -*-
#なんか「SyntaxError: Non-UTF-8 code starting with '\x8d'」というエラー吐くから

import re
text = '<h2 class="mainpage-heading"><span id=".E4.BB.8A.E6.97.A5.E3.81.AF.E4.BD.95.E3.81.AE.E6.97.A5_10.E6.9C.8829.E6.97.A5"></span><span class="mw-headline" id="今日は何の日_10月29日"><span class="mainpage-heading-image"><a href="/wiki/Wikipedia:%E4%BB%8A%E6%97%A5%E3%81%AF%E4%BD%95%E3%81%AE%E6%97%A5_10%E6%9C%88" title="Wikipedia:今日は何の日 10月"><img alt="""" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/38px-HSDagensdatum.svg.png" decoding="async" width="38" height="38" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/57px-HSDagensdatum.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/76px-HSDagensdatum.svg.png 2x" data-file-width="156" data-file-height="156"></a></span><span class="mainpage-heading-title"><a href="/wiki/Wikipedia:%E4%BB%8A%E6%97%A5%E3%81%AF%E4%BD%95%E3%81%AE%E6%97%A5_10%E6%9C%88" title="Wikipedia:今日は何の日 10月">今日は何の日</a> <a href="/wiki/10%E6%9C%8829%E6%97%A5" title="10月29日">10月29日</a></span></span></h2>'

tag = '<.*?>'  # 単品のタグを全部だしてみる
res = re.findall(tag, text)
for i in res:
    print(i)  # リストを直列出力

>>>
<h2 class="mainpage-heading">
<span id=".E4.BB.8A.E6.97.A5.E3.81.AF.E4.BD.95.E3.81.AE.E6.97.A5_10.E6.9C.8829.E6.97.A5">
</span>
<span class="mw-headline" id="今日は何の日_10月29日">
<span class="mainpage-heading-image">
<a href="/wiki/Wikipedia:%E4%BB%8A%E6%97%A5%E3%81%AF%E4%BD%95%E3%81%AE%E6%97%A5_10%E6%9C%88" title="Wikipedia:今日は何の日 10月">
<img alt="""" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/38px-HSDagensdatum.svg.png" decoding="async" width="38" height="38" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/57px-HSDagensdatum.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/39/HSDagensdatum.svg/76px-HSDagensdatum.svg.png 2x" data-file-width="156" data-file-height="156">
</a>
</span>
<span class="mainpage-heading-title">
<a href="/wiki/Wikipedia:%E4%BB%8A%E6%97%A5%E3%81%AF%E4%BD%95%E3%81%AE%E6%97%A5_10%E6%9C%88" title="Wikipedia:今日は何の日 10月">
</a>
<a href="/wiki/10%E6%9C%8829%E6%97%A5" title="10月29日">
</a>
</span>
</span>
</h2>

reの使い方③長い文章から特定の文字列を別の物に置換(sub)

#!/usr/bin/python
# -*- coding: Shift-JIS -*-

import re
text = 'キョウトへ行ったけど、思ったよりもキョウトっぽくなかった。トウキョウトはどうなんやろか?'
reg = 'キョウト'
after = '京都'
res = re.sub(reg, after, text)
print(res)

>>>
京都へ行ったけど、思ったよりも京都っぽくなかった。トウ京都はどうなんやろか?

reの使い方④正しい形になっているかバリデーションしたい

(validate:検証)

import re

def validate_url(url):
    reg = "^(http|https)://"
    res = re.match(reg, url)
    if res:
        print(url)
    else:
        print("これってurlじゃないよ")


text1 = "https://ja.wikipedia.org"
text2 = "ftp://192.168.0.1"

validate_url(text1)
>>>https://ja.wikipedia.org

validate_url(text2)
>>>これってurlじゃないよ

コメント

"+r+""+h+""+">"}var c,i=n(45),u=n(74),f=n(64),s=n(53),p=n(76),l=n(41),y=(n=n(52),"prototype"),h="script",v=n("IE_PROTO"),g=function(){try{c=new ActiveXObject("htmlfile")}catch(r){}var r;g="undefined"==typeof document||document.domain&&c?function(r){r.write(a("")),r.close();var t=r.parentWindow.Object;return r=null,t}(c):((r=l("iframe")).style.display="none",p.appendChild(r),r.src=String("javascript:"),(r=r.contentWindow.document).open(),r.write(a("document.F=Object")),r.close(),r.F);for(var t=f.length;t--;)delete g[y][f[t]];return g()};s[v]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(o[y]=i(t),n=new o,o[y]=null,n[v]=t):n=g(),e===r?n:u.f(n,e)}},function(r,t,e){var n=e(5),o=e(44),a=e(43),c=e(45),i=e(11),u=e(75);t.f=n&&!o?Object.defineProperties:function(r,t){c(r);for(var e,n=i(t),o=u(t),f=o.length,s=0;s=t||56320!=(64512&i(r,e))))return!1}return!0}})},function(r,t,e){var n=e(91),o=String;r.exports=function(r){if("Symbol"===n(r))throw new TypeError("Cannot convert a Symbol value to a string");return o(r)}},function(r,t,e){var n=e(2),o=e(7),a=e(13),c=e(15),i=e(102),u=(e=e(6),Array),f=a("".charAt),s=a("".charCodeAt),p=a([].join),l="".toWellFormed,y=l&&e((function(){return"1"!==o(l,1)}));n({target:"String",proto:!0,forced:y},{toWellFormed:function(){var r=i(c(this));if(y)return o(l,r);for(var t=r.length,e=u(t),n=0;n
タイトルとURLをコピーしました