Share
Embed
正規表現とセキュリティ / Regular Expressions and Their Security-Related Aspects
2020/03/15 にお茶の水女子大学内でセキュリティ・キャンプ (https://www.security-camp.or.jp/) の宣伝をした際に、それに合わせて小さな講義を提供しました。これはその発表資料です。
---
誤りを見つけたら、Twitter (https://twitter.com/lmt_swallow) の DM かポートフォリオサイト(https://shift-js.info/) で示されているメールアドレスまでご連絡ください。
Takashi Yoneuchi
March 15, 2020
Transcript
39 slides
-
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ 5BLBTIJ:POFVDIJ ‣ !MNU@TXBMMPX !ZOVDIZ ‣ ॴଐ ‣
'MBUU4FDVSJUZ *OD ‣ ౦ژେֶཧֶ෦ใՊֶՊ ‣ ଞͷ׆ಈ ‣ DUGCMFBEFS ‣ TFDDBNQڠٞձߨࢣҭ(اը( ‣ XFCTFDKQ ‣ 4FFIUUQTTIJGUKTJOGP -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ࠓ͍ͨ͜͠ͱ ਖ਼نදݱͱηΩϡϦςΟ ‣ ʮֶ෦ͰֶΜͰ͍ΔܭࢉػՊֶͷࣝɺͲΜͳͱ͜ΖͰཱ ͭΜͩΖ͏ʁʯͱ͍͏ૉͳٙʹ͍ͭͯɺηΩϡϦςΟٕज़ͷ؍ ͔Βߟ͑ͯΈΔɻ ‣ ࢀߟ͓͜͜ͷਫঁࢠେֶͰͷؔ࿈Պ
‣ σʔλߏͱΞϧΰϦζϜ ‣ ݴޠཧͱΦʔτϚτϯ ɾબ ‣ ܗࣜݴޠ ɾબ ‣ ਖ਼نදݱͦΕͦͷͷͱɺਖ਼نදݱʹؔ͢ΔηΩϡϦςΟత؍ Λɺ࣮༻ͱཧͷ྆໘͔Βཧֶͯ͠Ϳɻ ‣ ηΩϡϦςΟɾΩϟϯϓͷએ ओత ɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ࠓ͢͜ͱ ਖ਼نදݱͱηΩϡϦςΟ ‣ ೖɾਖ਼نදݱ ‣ ਖ਼نදݱͱԿ͔Λཧ͠·͢ɻ ‣ ਖ਼نදݱͷཧͱ࣮
‣ ਖ਼نදݱΛࢧ͑Δཧͷ֓؍ΛோΊͯɺ͔ͦ͜Βਖ਼نදݱΤϯδϯͷ ۪ͳ࣮ํʹ͍ͭͯٞ͠·͢ɻ ‣ ਖ਼نදݱͱ੬ऑੑ ‣ ਖ਼نදݱΤϯδϯͷ۪ͳ࣮ํ͔Βࣗવʹ༠ಋ͞ΕΔ߈ܸख๏ʹ ͍ͭͯΛઆ໌͠·͢ɻ ‣ ҙҰ෦ܗࣜతͳఆٛΛ࣋ͪग़ͯ͠આ໌͢Δ͕ɺޡΓؚ͕·ΕΔՄ ೳੑेʹ͋ΔͷͰɺదͳڭՊॻΛࢀর͢Δ͜ͱɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ʮจࣈྻݕࡧͬͯେมʜʯ ೖɾਖ਼نදݱ ‣ ࣍ͷΑ͏ͳೖྗ͔Β࣍ͷΑ͏ͳग़ྗΛಘ͍ͨɻ ‣ ೖྗ͍จࣈྻ ‣ ग़ྗೖྗதͷBCDͱEFGͰғ·Εͨ෦
ෳ͋Δ߹ෳ ‣ ղྫ۪ͳํ ‣ จࣈྻΛॱ൪ʹᢞΊ͍ͯ͘ɻͦͯ͠BCDΛΈ͚ͭ࣍ୈɺ͔ͦ͜ΒEFG͕ొ ͢Δ·ͰΛه͢Δɻ ‣ ۪ͳํͷࠔΓ͝ͱ ‣ গ͠Ͱ͕มΘΔͱίʔυΛେ͖͘มߋ͠ͳ͍͚ͯ͘ͳ͍ɻ ‣ ͨͩʮΔ͚ͩʯͷ࣮Ͱ͋ͬͯɺ࣮໘ɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱΛར༻͢Δ ೖɾਖ਼نදݱ ‣ ਖ਼نදݱΛར༻͢Δͱɺઌड़ͷΑ͏ͳจࣈྻݕࡧͪʹߦ͑Δɻ ‣ ਖ਼نදݱه߸ྻͷू߹ ݴޠ ΛͭͷจࣈྻͰද͢ํ๏ɻ
‣ ར ‣ ਖ਼نදݱҎ֎ͷ෦ͷίʔυΛ࠶ར༻͍͢͠ɻ ‣ จࣈྻͷݕࡧɾஔͷͨΊʹඞཁͳίʔυྔൺֱతখ͘͞ͳΔɻ import re s = 'abchogedef' print(re.match(r'abc(.*?)def', s).groups()) 1ZUIPO ਖ਼نදݱ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷجຊతͳߏจ ུ֓ ೖɾਖ਼نදݱ ‣ <> ׅ֯ހ ͦͷଆʹॻ͔Εͨจࣈͷ͏ͪͲΕ͔จࣈ
‣ ྫBCDE<> BCDEʹ͔Β·Ͱͷࣈ͕ଓ͍͍ͯΔΑ͏ͳจࣈྻ ‣ υοτ ΄΅શͯͷจࣈछͷ͏ͪͲΕ͔จࣈ ‣ ྫBCE BCͱEͷؒʹͳΜΒ͔ͷจࣈ͕ڬ·Ε͍ͯΔΑ͏ͳจࣈྻ ‣ ΞελϦεΫ ͦͷલͷਖ਼نදݱͷճҎ্ͷ܁Γฦ͠ ‣ ྫB BͷճҎ্ͷ܁Γฦ͠ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷ׆༻ࣄྫ ೖɾਖ਼نදݱ ‣ ্هͷ1ZUIPOεΫϦϓτεϖʔεͰ۠ΒΕͨͭͷจࣈྻͷ ॱংΛೖΕସ͑Δ FH+PIO'PPˠ'PP
+PIO ɻ ‣ ΩϟϓνϟɾࢀরΛۦ͢ΔͱɺඇৗʹศརߴͳςΩετૢ࡞͕ ͍ίʔυྔͰߦ͑Δɻ import re s = """John Foo John Bar John Foobar """ print(re.sub(r'^(.*) (.*)$', '\\2, \\1', s, flags=re.MULTILINE)) 1ZUIPOεΫϦϓτͷྫ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷ׆༻ࣄྫ ೖɾਖ਼نදݱ ‣ HSFQͰਖ਼نදݱΛར༻Ͱ͖Δɻ ‣ &ΦϓγϣϯΛར༻
‣ ্ड़ͷίϚϯυྫɺ͋ΔϑΝΠϧIPHFͷதͰɺ<>ʹ Ϛον͢ΔจࣈྻΛؚΉߦͷΈΛग़ྗ͢Δɻ cat hoge | grep -E "03/2[1-9]" HSFQ ਖ਼نදݱ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷ׆༻ࣄྫ ೖɾਖ਼نදݱ ‣ ҰൠతͳΤσΟλ FH FNBDT
WJN 7JTVBM 4UVEJP$PEF ʹਖ਼نද ݱʹΑΔςΩετૢ࡞ػೳ ͕͍͍ͭͯΔɻ ‣ εΫϦʔϯγϣοτͰɺ 7JTVBM4UVEJP$PEFͰ੨ ۭจݿͰ͞Ε͍ͯΔ ʰޗഐೣͰ͋ΔʱͷϧϏ ෦Λਖ਼نදݱͰϋΠϥΠ τ͍ͯ͠Δɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷߏจ ೖɾਖ਼نදݱ ‣ ͍͔ͭ͘ͷߏจ͕͋Δɻ ‣ ྫ104*9Ͱఆٛ͞Ε͍ͯΔͷ ‣ 43&
4JNQMF3FHVMBS&YQSFTTJPO ‣ #3& #BTJD3FHVMBS&YQSFTTJPO ‣ &3& &YUFOEFE3FHVMBS&YQSFTTJPO ‣ ྫ1FSM͕࠾༻͍ͯ͠Δͷ ‣ ΄΅+BWB 1ZUIPO 3VCZʹΈࠐ·Ε͍ͯΔΤϯδϯ1$3& 1FSM$PNQBUJCMF3FHVMBS&YQSFTTJPOT ͱಉ ‣ Ұ෦ܗࣜతͳਖ਼نදݱͷఆٛ ޙड़ ͔Βҳͨ͠ه๏Λ࣋ͭɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ جຊతͳޠ۟ͱه๏ͷఆٛ ਖ਼نදݱͷཧͱ࣮ ‣ ޠ ͋Δ͍ه߸ྻ ۭͰͳ͍จࣈू߹ ͷཁૉΛॏෳΛڐͯ͠༗
ݶݸ ݸҎ্ ฒͨྻͷ͜ͱɻ ‣ ۭޠ͞ͷه߸ྻͷ͜ͱͰ͋Γɺ͜ΕΛ ͱॻ͖ද͢ɻ ‣ ݴޠ ্ͷه߸ྻશମ͔ΒͳΔू߹ ͷ෦ू߹ɻ ‣ ࿈ه߸ྻ ʹ͍ͭͯɺ ͷ͋ͱʹ Λଓ͚ͯฒͨه߸ྻΛ ͱ ͷ࿈ͱݺͼɺ͜ΕΛ ͱॻ͖ද͢ɻ Σ ϵ Σ* Σ x, y x y x y xy -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نݴޠͷఆٛ ਖ਼نදݱͷཧͱ࣮ ‣ ه߸ू߹ ্ͷਖ਼نݴޠ ਖ਼ଇݴޠ ͷू߹ͷ࠶ؼతఆٛ ‣
ۭͷݴޠ ਖ਼نݴޠͰ͋Δɻ ‣ ۭޠͷΈ͔ΒͳΔݴޠ\ ^ਖ਼نݴޠͰ͋Δɻ ‣ தͷҙͷݩ ʹ͍ͭͯɺ୯߲ू߹\ ^ਖ਼نݴޠͰ͋Δɻ ‣ ͱ ͕ਖ਼نݴޠͰ͋Δ࣌ɺ ਖ਼نݴޠͰ͋Δɻ ‣ ʜ ͱ ͷू߹ ‣ ʜ ͳ͓ ‣ ʜ ‣ ͦΕҎ֎ͷ ্ͷݴޠਖ਼نݴޠͰͳ͍ɻ Σ ∅ ϵ Σ c c A B A ∪ B AB A* A ∪ B A B AB {ab|a ∈ A, b ∈ B} An = AAAA . . . . A A0 = {ϵ} A* ∪n {An |0 ≤ n} Σ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͷܗࣜతఆٛ ਖ਼نදݱͷཧͱ࣮ ‣ ه߸ू߹ ্ͷਖ਼نදݱ ͱͦΕ͕ද͢ू߹ ͷ࠶ؼతఆٛ ‣
ਖ਼نදݱͰ͋Γɺ͔ͭ Ͱ͋Δɻ ‣ தͷҙͷݩ ਖ਼نදݱͰ͋Γɺ͔ͭ Ͱ͋Δɻ ‣ ͕ਖ਼نදݱͰ͋Δͱ͖ɺҎԼ͕Γཱͭɻ ‣ ਖ਼نදݱͰɺ Ͱ͋Δɻ ‣ ਖ਼نදݱͰɺ Ͱ͋Δɻ ‣ ਖ਼نදݱͰɺ Ͱ͋Δɻ ‣ ਖ਼نදݱͰɺ Ͱ͋Δɻ ‣ ͜ΕΒͷنଇʹΑΓಋग़͞ΕΔه߸ྻͷΈ͕ਖ਼نදݱͰ͋Δɻ Σ e L(e) ∅ ϵ L(∅) = ∅, L(ϵ) = {ϵ} Σ c L(c) = {c} e1 , e2 (e1 ) L((e1 )) = L(e1 ) e1 |e2 L(e1 |e2 ) = L(e1 ) ∪ L(e2 ) e1 e2 L(e1 e2 ) = L(e1 )L(e2 ) e* 1 L(e* 1 ) = (L(e1 ))* -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ༗ݶΦʔτϚτϯ ུ֓ ਖ਼نදݱͷཧͱ࣮ ‣ ඇܾఆੑ༗ݶΦʔτϚτϯ /POEFUFSNJOJTUJD'JOJUF"VUPNBUPO/'"
‣ ঢ়ଶू߹ จࣈू߹ ભҠؔ ։࢝ঢ়ଶ डཧঢ়ଶू߹ ͷͭͷɻ ‣ ભҠؔͷఆٛͷ Λ ͱͨ͠ͷΛ /'"ͱݺͿɻ ‣ ܾఆੑ༗ݶΦʔτϚτϯ %FUFSNJOJTUJD'JOJUF"VUPNBUPO%'" ‣ ͕Γཱͭ/'"ͷ͜ͱɻ ͜ͷͱ͖ભҠؔભҠؔͱݺΕΔɻ Q Σ δ ⊆ Q × Σ × Q q0 ∈ Q F ⊆ Q Σ Σ ∪ {ϵ} ϵ ∀q ∈ Q . ∀c ∈ Σ . |{q′ |(q, c, q′ ) ∈ δ}| = 1 -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ભҠͱडཧ ਖ਼نදݱͷཧͱ࣮ ‣ ඇܾఆੑ ༗ݶΦʔτϚτϯ ʹ͍ͭͯͷఆٛ ‣
ભҠͭ ΛભҠͱݺͿɻ ‣ डཧ͢Δͭͷ༻๏ ‣ ه߸ྻ ʹ͍ͭͯɺ ͕ଘࡏ͠ɺ ͔ͭ ͕Γཱͭͱ͖ɺ ه߸ྻ Λडཧ͢Δͱ͍͏ɻ ‣ ͱఆٛͨ࣌͠ʹɺ Λ ͷडཧ ݴޠͱݺͼɺ͋Δݴޠ ʹ͍ͭͯ Ͱ͋Δ͜ͱΛ ͕ Λडཧ ͢Δɺͱ͍͏ɻ M = (Q, Σ, δ, q0 , F) (p, a, q) ∈ δ w = c1 c2 . . . cn q1 , q2 , . . . , qn ∈ Q (q0 , c1 , q1 ), (q1 , c2 , q2 ), . . . , (qn−1 , cn , qn ) ∈ δ qn ∈ F M w L(M) = {w ∈ Σ*|MwΛडཧ͢Δ} L(M) M L L = L(M) M L -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱͱ༗ݶΦʔτϚτϯ ਖ਼نදݱͷཧͱ࣮ ‣ ࣮ਖ਼نදݱͱ༗ݶΦʔτϚτϯʹਂ͍ؔΘΓ͕͋Δɻ ‣ ਖ਼نݴޠ㲗 /'"͍͔ͳΔਖ਼نݴޠʹ͍ͭͯɺͦΕΛडཧ͢Δ
/'"͕ଘࡏ͢Δɻٯʹ͍͔ͳΔ /'"ʹ͍ͭͯɺͦͷडཧݴ ޠਖ਼نݴޠͰ͋Δɻ ‣ /'"㲗%'"͍͔ͳΔ/'"ʹ͍ͭͯɺͦΕͱडཧݴޠ͕Ұக͢Δ %'"͕ଘࡏ͢Δ ώϯτঢ়ଶू߹Λͦͷ͖ू߹ʹஔ ɻٯʹ͍͔ͳ Δ%'"ʹ͍ͭͯɺͦΕͱडཧݴޠ͕͍͠/'"͕ଘࡏ͢Δɻ ‣ /'"㲗 /'"͜ΕΒ/'"㲗%'"ಉ༷ʹมՄೳɻ ‣ ͭ·Γɺ͔ͳΓࡶʹදݱ͢ΔͱɺҎԼཱ͕͢Δɻ ‣ ਖ਼نදݱͷදݱೳྗ /'"ͷදݱೳྗ %'"ͷදݱೳྗ ϵ ϵ ϵ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ਖ਼نදݱΤϯδϯͷԠ༻ ਖ਼نදݱͷཧͱ࣮ ‣ ઌͷࣄ࣮͔Βɺਖ਼نදݱΤϯδϯͷ۪ͳ࣮ํ͕ಘΒΕΔɻ ‣ ೖྗਖ਼نදݱͱݕࡧରͷจࣈྻͷͭɻ ‣ ग़ྗਖ਼نදݱʹจࣈྻ͕Ϛον͔ͨ͠Ͳ͏͔ɻ
‣ ΞϧΰϦζϜ ‣ ਖ਼نදݱΛҰ/'"ʹม͢Δɻ ‣ ݕࡧରͷจࣈྻΛೖྗͱͯ͠/'"্ͷঢ়ଶભҠΛߦ͏ɻ ‣ ભҠޠͷ࠷ऴঢ়ଶ͕डཧঢ়ଶͰ͋ΕʮϚονͨ͠ʯͱग़ྗ͠ɺ͞ͳ ͘ʮϚον͠ͳ͔ͬͨʯΛग़ྗ͢Δɻ ‣ ࣮ࡍ/'"ܕɾ%'"ܕɾ7.ܕͳͲͱݺΕΔ࣮ํ͕ଘࡏ͠ ͓ͯΓɺͦΕͧΕҟͳΔརɾܽΛ࣋ͭɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ /'"ϕʔεͷਖ਼نදݱΤϯδϯ ਖ਼نදݱͷཧͱ࣮ ‣ /'"ϕʔεͷΞϧΰϦζϜͷརͱܽ ‣ ར࣮͕༰қ ‣ ܽඇܾఆੑ
OPOEFUFSNJOJTN ͷ ‣ ೖྗ͔Β࣍ͷભҠઌঢ়ଶ͕Ұҙʹఆ·Βͳ͍ɻ ‣ ભҠઌঢ়ଶ͕Ұҙʹఆ·Βͳ͍࣌ͷํͷྫ ‣ #BDLUSBDLJOH ‣ ભҠީิͷ͏ͪͲΕ͔ʹભҠ͠ɺͩΊͳΒผͷީิΛࢼ͢ɺΛ܁Γฦ͢ɻ ‣ ,FO5IPNQTPOT"MHPSJUIN ‣ ಉ࣌ʹෳީิΛࢼ͍ͯ͘͠ JFPOUIFqZͷႈू߹ߏ ɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠ࢝ঢ়ଶˠঢ়ଶ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠෳީิ͕͋Δ ˠ ˠͷͭͷ ભҠೖ ྗΛফඅ͠ͳ͍ભҠ ɻ͜͜Ͱࢼ͠ʹ͔ΒʹਐΜͰΈΔɻ ϵ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠࠓண͍ͯ͠ΔจࣈDͳͷͰ͔ΒભҠͰ͖ͳ ͍ɻͳͷͰઌఔࢼ͠ʹʹਐΜͩͷΛऔΓΊͯɺʹભҠ͢Δɻ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠˠ ʹΑΔભҠ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠˠ ભҠ ϵ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ࣍ͷঢ়ଶભҠˠ CʹΑΔભҠ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ όοΫτϥοΫͷྫ ਖ਼نදݱͷཧͱ࣮ ‣ ҎԼͷ /'" ਖ਼نදݱB
CͱՁ ʹೖྗBDCΛ༩͑Δɻ ‣ ೖྗதͷࠓ͍ͯ͠ΔจࣈBDC ‣ ೖྗΛશͯಡΈ͖͓ͬͯΓɺ͔ͭऴঢ়ଶ͕डཧঢ়ଶͳͷͰɺจࣈ ྻϚονʹޭͨ͜͠ͱ͕Θ͔Δɻ ϵ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ηΩϡϦςΟత؍ ਖ਼نදݱͱ੬ऑੑ ‣ ਖ਼نදݱͷ؍ਖ਼֬͞ͱύϑΥʔϚϯε ‣ ਖ਼֬ͦ͞ͷਖ਼نදݱॴͷݕࡧΛ࣮ݱ͢ΔͷʹΔͷ͔ɻ ‣
จࣈྻT͕KQHͰऴΘΔจࣈྻ͔Ͳ͏͔Λௐ͍ͨͱ͖ʹɺ SFNBUDI S aKQH T ͷ݁ՌΛར༻͢Δͷద͔Ͳ͏͔ߟ͑Αɻ ‣ ͜ΕͰTͱͯ͠IPHFKQHIUNMͷจࣈྻڐ༰͞Εͯ͠·͏ɻ ‣ ਖ਼نදݱʹͨ͘͞Μͷམͱ͕݀͠ʜ ࢀߟBUUBDLFSDBOSFHFYQTFDVSJUZDIFBUTIFFU IUUQTHJUIVCDPNBUUBDLFSDBOSFHFYQTFDVSJUZDIFBUTIFFU ‣ ύϑΥʔϚϯεͦͷਖ਼نදݱʹ͔͔ΔϦιʔεݱ࣮త͔ɻ ‣ ਖ਼نදݱͷධՁʹ͔͔ΔϦιʔε͕ലେʹͳΔ͜ͱ͋Δ͔ɻ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ʮ͋Εɺݕࡧ͕ऴΘΒͳ͍ʜʯ ਖ਼نදݱͱ੬ऑੑ ‣ ؍্ड़ͷ1ZUIPOεΫϦϓτͷධՁݱ࣮తͳ࣌ؒͰऴΘΒͳ ͍ɻ ‣ ཧ༝େྔͷόοΫτϥοΫ͕ൃੜ͢Δ͜ͱɻ ‣
1ZUIPOͷSF/'"ϕʔεͷΤϯδϯͰ͋ΓɺભҠઌͷঢ়ଶ͕Ұҙ ʹఆ·Βͳ͍߹ʹόοΫτϥοΫΛߦ͏ɻ ‣ ͷΑ͏ͳωετͨ͠ྔԽࢠ͕ਖ਼نදݱதʹؚ·Ε͍ͯΔ͜ͱʹΑ ΓɺBBBBBBதͷBͷݸΛ ͱͨ࣌͠ʹɺ ճఔͷόοΫ τϥοΫ͕ىͬͯ͜͠·͏ɻ n O(2n) import re; re.match(r'^(.*)*a$', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaa!') -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ? BʹରԠ͢Δ /'" ਖ਼نදݱͱ੬ऑੑ ϵ ‣
ঢ়ଶͱ ঢ়ଶͱͰͦΕͧΕϧʔϓ͕Ͱ͖͍ͯΔɻ ‣ ਖ਼نදݱதͰ ʹ͋ͨΔ෦ɻ ‣ ଆͷঢ়ଶ ͷϧʔϓͰೖྗΛԿจࣈফඅ͢Δ͔͕ࣗ༝Ͱ͋ Γɺ͔ͭ ͷϧʔϓࣗମ ͷϧʔϓͰ܁Γฦ͞ΕΔʜ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ 3F%P4 3FHVMBSFYQSFTTJPO%FOJBMPG4FSWJDF ਖ਼نදݱͱ੬ऑੑ ‣ 3F%P4 3FHVMBSFYQSFTTJPO%FOJBMPG4FSWJDF
‣ ੬ऑͳਖ਼نදݱʹΑΔจࣈྻૢ࡞͕ඇৗʹ͍࣌ؒɾେ͖͍ۭؒΛར ༻͢Δ͜ͱΛ༻͍ͨ%P4 %FOJBMPG4FSWJDF ߈ܸͷ͜ͱɻ ‣ ੬ऑͳਖ਼نදݱʜ όοΫτϥοΩϯάࣜΤϯδϯ্Ͱ ͋Δจࣈྻ Λ༩͑ͨ࣌ʹɺͦͷ͞ʹؔ͠ඇઢܗ࣌ؒΛཁ͢Δਖ਼نදݱͷ͜ͱɻ ‣ ੬ऑͳਖ਼نදݱͱͯ͠ҎԼͷύλʔϯ͕ఆͰ͖Δɻ ‣ ։ൃऀ͕༻ҙͨ͠ਖ਼نදݱ ‣ ഽײ֮ͱͯ͠ใࠂ͞Ε͍ͯΔ3F%P4੬ऑੑͷେͪ͜ΒͷλΠϓ ‣ Ϣʔβʔೖྗ͔Βߏ͞Εͨਖ਼نදݱ ‣ JF3FHVMBS&YQSFTTJPO*OKFDUJPO 3FHFYQ*OKFDUJPO ʹΑΔͷ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ 3F%P4߈ܸͷݱ࣮ ਖ਼نදݱͱ੬ऑੑ ‣ ੈͷதʹग़ճ͍ͬͯΔϥΠϒϥϦɾιϑτΣΞதͷ3F%P4੬ऑ ੑ͠͠ใࠂ͞Ε͍ͯΔɻ ‣ ࢀߟ$"4UBJDVBOE.1SBEFM l'SFF[JOHUIF8FC"4UVEZPG3F%P47VMOFSBCJMJUJFTJO+BWB4DSJQUCBTFE8FC
4FSWFST zJOUI64&/*94FDVSJUZ4ZNQPTJVN 64&/*94FDVSJUZ QQr ‣ ࢀߟ+$%BWJT $"$PHIMBO '4FSWBOU BOE%-FF l5IF*NQBDUPG3FHVMBS&YQSFTTJPO%FOJBMPG4FSWJDF 3F%P4 JO1SBDUJDF"O&NQJSJDBM4UVEZBUUIF&DPTZTUFN4DBMF zJO1SPDFFEJOHTPGUIFUI"$.+PJOU .FFUJOHPO&VSPQFBO4PGUXBSF&OHJOFFSJOH$POGFSFODFBOE4ZNQPTJVNPOUIF'PVOEBUJPOTPG4PGUXBSF &OHJOFFSJOH QQr ‣ /PEFKTͷϥΠϒϥϦʹ͓͚Δ3F%P4੬ऑੑΑ͘ใࠂ͞Εͯ ͍Δ͕ɺͦͷTJOHMFUISFBEੑΛؑΈΔͱɺ͜Εେɻ ‣ ࢀߟ3F%P4WVMOFSBCJMJUJFTJOOQNTQJLFTCZBOE944DPOUJOVFTUPHSPXCZTOZL IUUQTTOZLJPCMPHSFEPTWVMOFSBCJMJUJFTJOOQNTQJLFTCZBOEYTTDPOUJOVFTUPHSPX -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ରࡦ ਖ਼نදݱͱ੬ऑੑ ‣ ਖ਼نදݱͷධՁʹ͔͚ͯΑ͍ϦιʔεΛ੍ݶ͢Δɻ ‣ /&5Ͱඪ४ͰλΠϜΞτػೳ͕ఏڙ͞Ε͍ͯΔɻ IUUQTEPDTNJDSPTPGUDPNFOVTEPUOFUBQJ TZTUFNUFYUSFHVMBSFYQSFTTJPOTSFHFYNBUDIUJNFPVU
WJFXOFUGSBNFXPSL ‣ 1ZUIPOλΠϜΞτػೳ͖ͷϞδϡʔϧଘࡏ͍ͯ͠Δɻ IUUQTQZQJPSHQSPKFDUSFHFY ‣ όοΫτϥοΫΛ͠ͳ͍λΠϓͷΤϯδϯΛར༻͢Δɻ ‣ ྫ3& IUUQTHJUIVCDPNHPPHMFSF ‣ ΞϯνύλϯΛආ͚Δɻ ‣ ྫྔԽࢠͷωετ -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ #MJOE3FHFY*OKFDUJPO ਖ਼نදݱͱ੬ऑੑ ‣ ҎԼͷ݅ԼͰɺจࣈྻTΛϦʔΫ͢Δख๏͋Δ͔ɻ ‣ ߈ܸऀҙͷਖ਼نදݱͰ͋ΔจࣈྻT্ΛݕࡧͰ͖Δɻ ‣ ͜ͷਖ਼نදݱͷධՁʹλΠϜΞτ
Uඵ ͕՝͞Ε͓ͯΓɺ͔ͭ όοΫτϥοΩϯάࣜͷΤϯδϯ͕ར༻͞Ε͍ͯΔɻ ‣ ߈ܸྫ#MJOE3FHFY*OKFDUJPO"UUBDL ‣ ԾఆU͕ेʹେ͖͍ɻ ‣ ख๏ʮจࣈྻT͕͋ΔจࣈྻY͔Β࢝·Δͱ͖ʹͦͷධՁʹUඵΛ ϑϧʹফඅ͠ 3F%P4߈ܸΛߦ͍ ɺͦΕҎ֎ͷ࣌ʹͪʹධՁ͕ऴྃ ͢ΔʯΑ͏ͳਖ਼نදݱΛߏ͠ɺݕࡧΛ܁Γฦ͢ɻ ‣ ࢀߟ"3PVHI*EFBPG#MJOE3FHVMBS&YQSFTTJPO*OKFDUJPO"UUBDL IUUQTEJBSZTIJGUKTJOGPCMJOESFHVMBSFYQSFTTJPOJOKFDUJPO -
TIJGUKTJOGP ਖ਼نදݱͱηΩϡϦςΟ ࠷ޙʹ ਖ਼نදݱͱηΩϡϦςΟ ‣ ࠓҎԼͷʹ͍ͭͯͨ͠ɻ ‣ ֶ෦Ͱ͠͠औΓѻΘΕΔਖ਼نදݱʹ·ͭΘΔ ‣ ͔ͦ͜Βࣗવʹ༠ಋ͞ΕΔηΩϡϦςΟ্ͷ
‣ ϝοηʔδ ‣ ֶ෦ͰऔΓѻΘΕΔجૅࣝͨͪ FH04 άϥϑཧ ܗࣜݴޠཧ ҉߸ ɺҊ֎ વ ࠓͷใࣾձΛࢧ͍͑ͯΔɻ ‣ ·ͨͦͷΑ͏ͳجૅࣝͨͪΛਖ਼࣋ͭ͘͜͠ͱɺ҆৺ɾ҆શͳϓϩ άϥϜΛॻ͘͜ͱηΩϡϦςΟϦεΫͷධՁʹ׆͖ͯ͘Δɻ ‣ ͦͯ͠ηΩϡϦςΟɾΩϟϯϓجૅࣝΛಘΔ׆͔͢ͷʹ࠷దͳ ɻͥͻηΩϡϦςΟɾΩϟϯϓʹ͝ԠืΛ