Python & Perl  PY Regular Expression Compilation & Match List Iteration,                      PL /g Quantifier,        PL ...
Outline   ●   Review of Regular Expression Match Patterns   ●   PY Pattern Compilation & Match List Iteration   ●   PL /g ...
Reviewwww.youtube.com/vkedco       www.vkedco.blogspot.com
Match Pattern 01                ############################################                ## Match pattern pat against t...
PY Pattern 01 Example        import re        txt_01 = ab Ab aB AB        ## match pattern (ab)* against txt_01 case sensi...
PL Pattern 01 Example      my $txt_01 = ab Ab aB AB;      ## match pattern (ab)* against txt_01 case sensitively      $txt...
Match Pattern 02               ##################################################               ## Match pattern pat at th...
PY Pattern 02 Example        import re        txt_02 = abc de fg        ## pattern = r^(abc)*: match zero or more        #...
PL Pattern 02 Example        my $txt_02 = abc de fg;        ## pattern = ^(abc)*: match zero or more        ## occurrences...
Match Pattern 03             ##################################################             ## Match pattern pat at the ri...
PY Pattern 03 Example        import re        ## match (abc)* at the right end of txt_02        re_match_pat_03_match_01 =...
PY Pattern 03 Example        import re        txt_03 = abc de 123        ## match (d)+ at the right end of txt_03        r...
PL Pattern 03 Example     my $txt_02 = abc de fg;     ## match (abc)* at the right end of $txt_02     $txt_02 =~ /(abc)*$/...
PL Pattern 03 Example     my $txt_03 = abc de 123;     ## match (d)+ at the right end of $txt_03     $txt_03 =~ /((d)+)$/;...
Match Pattern 04                ################################################                ## Match pattern pat again...
PY Pattern 04 Example        import re        txt_04 = 12345;        ## match (d)+ against the entire txt_04.        re_ma...
PL Pattern 04 Example     my $txt_04 = 12345;     ## match (d)+ against the entire $txt_04.     ## prints group = 12345   ...
Match Pattern 05                ################################################                ## Match pattern pat again...
PY Pattern 05 Example         import re         txt_05 = aBc;         ## match (abc) against txt_05 case insensitively.   ...
PY Pattern 05 Example         import re         txt_05 = aBc;         ## match (abc)+ against txt_05 case sensitively.    ...
PL Pattern 05 Example        my $txt_05 = aBc;        ## match (abc) against $txt_05 case insensitively.        $txt_05 =~...
PL Pattern 05 Example        ## match (abc) against $txt_05 case sensitively.        ## prints no match found because (abc...
PY Group Example 01      txt_01 = 1+1=2      ## Suppose we match /(d)+(d)=(d)/ against txt_01      match_01 = re.search(r(...
PY Group Example 02    txt_01 = 1+1=2    ## Suppose we match /((d)+(d)=(d))/ againsttxt_01    match_02 = re.search(r((d)+(...
PL Group Example 01      my $txt_01 = 1+1=2;      ## Suppose we match /(d)+(d)=(d)/ against $txt_01      $txt_01 =~ /(d)+(...
PL Group Example 02      my $txt_01 = 1+1=2;      ## Suppose we match /((d)+(d)=(d))/ against $txt_01.      $txt_01 =~ /((...
PY Pattern Compilation & Match List                  Iterationwww.youtube.com/vkedco   www.vkedco.blogspot.com
Sample Problem    Design a regular expression that parses    unnumbered HTML lists (<ul>...</ul>) and finds    its items (...
Possible <li></li> Pattern       li_pat_str = r<li>(?:w|s|d)*</li>www.youtube.com/vkedco          www.vkedco.blogspot.com
Finding <li></li> Tags      txt = n      <ul>n      <li>list item 01</li>n      <li>list item 02</li>n      </ul>n        ...
Finding <li></li> Tags              txt = n              <ul>n              <li>list item 01</li>n              <li>list i...
PL /g Quantifierwww.youtube.com/vkedco        www.vkedco.blogspot.com
Outline   ●   /g quantifier is used after regular expression pat-       terns, e.g., /pattern/g   ●   In the list context,...
Example                 my $txt = aaaaaa;                 my $pat = (aa);                 my @list = $txt =~ /$pat/g;     ...
Using /g To Iterate Through Matches          ## What if you need to iterate through all matches?           ## Here is a co...
Example 01        ## Suppose we have some pattern $pat and we want to find out how many times         ## $pat matched some...
Example 02        ## Suppose we have some pattern $pat and we want to find out how many times         ## $pat matched some...
Case Study:          HTML Form Input Verificationwww.youtube.com/vkedco    www.vkedco.blogspot.com
Problem    Use regular expressions to verify the validity of    user names and phone numbers submitted in an    HTML Post ...
HTML Post Form       <html>         <head><title>Registration Form</title></head>         <body>         <form method = "p...
Possible Phone Number Pattern     # (?:1(.| |­))?      # ?:          ­ do not bind this subexpression to a group     # 1(....
Possible User Name Patterns              my $first_name_pat = [A­Z](w|­)+;              my $last_name_pat  = [A­Z](w|­)+;w...
References  ●   www.python.org  ●   http://docs.python.org/2/  ●   www.perl.org  ●   http://perldoc.perl.org/www.youtube.c...
Upcoming SlideShare
Loading in …5
×

Python & Perl: PY Pattern Compilation and Match List Iteration; PL /g Quantifier; PL Case Study: HTML Form Input Verification

1,010 views
905 views

Published on

Python & Perl: PY Pattern Compilation and Match List Iteration; PL /g Quantifier; PL Case Study: HTML Form Input Verification

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,010
On SlideShare
0
From Embeds
0
Number of Embeds
252
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Python & Perl: PY Pattern Compilation and Match List Iteration; PL /g Quantifier; PL Case Study: HTML Form Input Verification

  1. 1. Python & Perl PY Regular Expression Compilation & Match List Iteration, PL /g Quantifier, PL Case Study: HTML Form Input Verification Vladimir Kulyukinwww.youtube.com/vkedco www.vkedco.blogspot.com
  2. 2. Outline ● Review of Regular Expression Match Patterns ● PY Pattern Compilation & Match List Iteration ● PL /g Quantifier ● Case Study: PL HTML Post Form Data Verificationwww.youtube.com/vkedco www.vkedco.blogspot.com
  3. 3. Reviewwww.youtube.com/vkedco www.vkedco.blogspot.com
  4. 4. Match Pattern 01 ############################################ ## Match pattern pat against text txt  ## case sensitively ## match = re.search(rpat, txt) ############################################ ############################################ ## Match pattern pat against text txt  ## case sensitively ## $txt =~ /pat/; ################################################www.youtube.com/vkedco www.vkedco.blogspot.com
  5. 5. PY Pattern 01 Example import re txt_01 = ab Ab aB AB ## match pattern (ab)* against txt_01 case sensitively re_match_pat_01_match_01 = re.search(r(ab)*, txt_01) ## print the entire match group ## prints group = ab print group = , re_match_pat_01_match_01.group() ## print the span of the entire match group; ## prints span = (0, 2) print span = , re_match_pat_01_match_01.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  6. 6. PL Pattern 01 Example my $txt_01 = ab Ab aB AB; ## match pattern (ab)* against txt_01 case sensitively $txt_01 =~ /(ab)*/; ## print the entire match group via backreference $1. print "group = $1n"; ## the following PL print statement simulates the following ## Pythons print span = , re_match_pat_01_match_01.span() ## $1 is a backreference to the substring of $txt_01 that matches /(ab)*/. ## index($txt_01, $1) returns the leftmost index of $1 in $txt_01. ## prints span = (0, 2) my $index_01 = index($txt_01, $1); print span = , (, $index_01, , , $index_01 + length($1), ), "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  7. 7. Match Pattern 02 ################################################## ## Match pattern pat at the left side of text  ## txt (left adjusted match) case sensitively ## match = re.search(r^pat, txt) ################################################ ################################################ ## Match pattern pat at the left side of text  ## txt (left adjusted match) case sensitively ## $txt =~ /^pat/; ################################################www.youtube.com/vkedco www.vkedco.blogspot.com
  8. 8. PY Pattern 02 Example import re txt_02 = abc de fg ## pattern = r^(abc)*: match zero or more ## occurrences of abc at the left end of txt_02 re_match_pat_02_match_01 = re.search(r^(abc)*, txt_02) ## print the entire match group ## prints group = abc print group = , re_match_pat_02_match_01.group() ## print the span of the entire match group; ## prints span = (0, 3) print span = , re_match_pat_02_match_01.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  9. 9. PL Pattern 02 Example my $txt_02 = abc de fg; ## pattern = ^(abc)*: match zero or more ## occurrences of abc at the beginning of $txt_02 $txt_02 =~ /^(abc)*/; ## $1 is a backreference to the substring of $txt_02 ## that matches ^(abc)* ## prints group = abc print group = , $1, "n"; ## index($txt_02, $1) returns the leftmost index of $1 in $txt_02. ## prints span = (0, 3) my $index_02 = index($txt_02, $1); print  span  =  ,  (,  $index_02,  ,  ,  $index_02  +  length($1),  ),  "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  10. 10. Match Pattern 03 ################################################## ## Match pattern pat at the right side of text  ## txt (right adjusted match) case sensitively ## match = re.search(rpat$, txt) ################################################ ################################################## ## Match pattern pat at the right side of text  ## txt (right adjusted match) case sensitively ## $txt =~ /pat$/; ################################################www.youtube.com/vkedco www.vkedco.blogspot.com
  11. 11. PY Pattern 03 Example import re ## match (abc)* at the right end of txt_02 re_match_pat_03_match_01 = re.search(r(abc)*$, txt_02) ## print the entire match group, which is empty ## in this case. ## prints group =  print group = , re_match_pat_03_match_01.group() ## prints span = (9, 9) print span = , re_match_pat_03_match_01.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  12. 12. PY Pattern 03 Example import re txt_03 = abc de 123 ## match (d)+ at the right end of txt_03 re_match_pat_03_match_02 = re.search(r(d)+$, txt_03) ## prints group = 123 print group = , re_match_pat_03_match_02.group() ## prints span = (7, 10) print span = , re_match_pat_03_match_02.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  13. 13. PL Pattern 03 Example my $txt_02 = abc de fg; ## match (abc)* at the right end of $txt_02 $txt_02 =~ /(abc)*$/; ## prints group =  with a warning that $1 is not ## initialized, because there is no match for (abc)* in $txt_02. print group = , $1, "n"; ## index($txt_02, $1) returns the leftmost index of $1 in $txt_02. ## prints span = (0, ) with a warning, because $1 is not defined my $index_03 = index($txt_02, $1); print span = , (, $index_03, , , $index_03 + length($1), ), "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  14. 14. PL Pattern 03 Example my $txt_03 = abc de 123; ## match (d)+ at the right end of $txt_03 $txt_03 =~ /((d)+)$/; ## prints group = 3 print group = , $1, "n"; ## prints span = (9, 10) ## NOTE: if the reg expression is /(d)+$/, then group = 3 is ## printed out. my $index_04 = index($txt_03, $1); print span = , (, $index_04, , , $index_04 + length($1), ), "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  15. 15. Match Pattern 04 ################################################ ## Match pattern pat against the entire text txt ## match = re.search(r^pat$, txt) ################################################ ################################################ ## Match pattern pat against the entire text txt ## $txt =~ /^pat$/; ################################################www.youtube.com/vkedco www.vkedco.blogspot.com
  16. 16. PY Pattern 04 Example import re txt_04 = 12345; ## match (d)+ against the entire txt_04. re_match_pat_04_match_01 = re.search(r^(d)+$, txt_04) ## prints group = 12345 print group = , re_match_pat_04_match_01.group() ## prints span = (0, 5) print span = , re_match_pat_04_match_01.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  17. 17. PL Pattern 04 Example my $txt_04 = 12345; ## match (d)+ against the entire $txt_04. ## prints group = 12345 $txt_04 =~ /(^(d)+$)/; print group = , $1, "n"; ## prints span = (0, 5) my $index_05 = index($txt_04, $1); print span = , (, $index_05, , , $index_05 + length($1), ), "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  18. 18. Match Pattern 05 ################################################ ## Match pattern pat against text txt  ## case insensitively ## match = re.search(rpat, txt, re.IGNORECASE) ################################################ ################################################ ## Match pattern pat against the text txt  ## case insensitively ## $txt =~ /pat/i; ################################################www.youtube.com/vkedco www.vkedco.blogspot.com
  19. 19. PY Pattern 05 Example import re txt_05 = aBc; ## match (abc) against txt_05 case insensitively. re_match_pat_05_match_01 = re.search(rabc, txt_05, re.IGNORECASE) ## prints group = aBc print group = , re_match_pat_05_match_01.group() ## prints span = (0, 3) print span = , re_match_pat_05_match_01.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  20. 20. PY Pattern 05 Example import re txt_05 = aBc; ## match (abc)+ against txt_05 case sensitively. ## there is no case sensitive match re_match_pat_05_match_02 = re.search(rabc, txt_05) if re_match_pat_05_match_02 == None:     print no case sensitive match else:     print group = , re_match_pat_05_match_02.group()     print span = , re_match_pat_05_match_02.span()www.youtube.com/vkedco www.vkedco.blogspot.com
  21. 21. PL Pattern 05 Example my $txt_05 = aBc; ## match (abc) against $txt_05 case insensitively. $txt_05 =~ /(abc)/i; ## prints group = (aBc) print group = , $1, "n"; ## prints span = (0, 3) my $index_06 = index($txt_05, $1); print span = , (, $index_06, , , $index_06 + length($1), ), "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  22. 22. PL Pattern 05 Example ## match (abc) against $txt_05 case sensitively. ## prints no match found because (abc) does not match aBc. if ( $txt_05 =~ /(abc)/ ) {   print group = , $1, "n";   my $index_07 = index($txt_05, $1);   print span = , (, $index_07, , , $index_07 + length($1), ), "n"; } else {   print no match found, "n"; }www.youtube.com/vkedco www.vkedco.blogspot.com
  23. 23. PY Group Example 01 txt_01 = 1+1=2 ## Suppose we match /(d)+(d)=(d)/ against txt_01 match_01 = re.search(r(d)+(d)=(d), txt_01) ## Then the group alignment is as follows: ## /(d)+(d)=(d)/ ##  1     2     3 ## In other words, group 1 is bound to 1, ## group 2 is bound to 2 and group 3 is bound to 3www.youtube.com/vkedco www.vkedco.blogspot.com
  24. 24. PY Group Example 02 txt_01 = 1+1=2 ## Suppose we match /((d)+(d)=(d))/ againsttxt_01 match_02 = re.search(r((d)+(d)=(d)), txt_01) ## Then the special variable alignment is: ## /((d)+(d)=(d))/; ##  12     3    4 ## In other words, group 1 is bound to 1+1=2, ## group 2 is bound to 1 and group 3 is bound to 1, ## group 4 is bound to 2.www.youtube.com/vkedco www.vkedco.blogspot.com
  25. 25. PL Group Example 01 my $txt_01 = 1+1=2; ## Suppose we match /(d)+(d)=(d)/ against $txt_01 $txt_01 =~ /(d)+(d)=(d)/; ## Then the variable alignment is as follows: ## /(d)+(d)=(d)/ ## $1     $2    $3 ## In other words, $1 is bound to 1, ## $2 is bound to 2 and $3 is bound to 3www.youtube.com/vkedco www.vkedco.blogspot.com
  26. 26. PL Group Example 02 my $txt_01 = 1+1=2; ## Suppose we match /((d)+(d)=(d))/ against $txt_01. $txt_01 =~ /((d)+(d)=(d))/; ## Then the special variable alignment is ## /((d)+(d)=(d))/; ## $1$2    $3   $4 ## In other words, $1 is bound to 1+1=2, ## $2 is bound to 1 and $3 is bound to 1, ## $4 is bound to 2.www.youtube.com/vkedco www.vkedco.blogspot.com
  27. 27. PY Pattern Compilation & Match List Iterationwww.youtube.com/vkedco www.vkedco.blogspot.com
  28. 28. Sample Problem Design a regular expression that parses unnumbered HTML lists (<ul>...</ul>) and finds its items (<li>...</li>)www.youtube.com/vkedco www.vkedco.blogspot.com
  29. 29. Possible <li></li> Pattern li_pat_str = r<li>(?:w|s|d)*</li>www.youtube.com/vkedco www.vkedco.blogspot.com
  30. 30. Finding <li></li> Tags txt = n <ul>n <li>list item 01</li>n <li>list item 02</li>n </ul>n li_pat_str = r<li>(?:w|s|d)*</li> ## [<li>list item 01</li>, <li>list item 02</li>] li_list = re.findall(li_pat_str, txt) print li_listwww.youtube.com/vkedco www.vkedco.blogspot.com
  31. 31. Finding <li></li> Tags txt = n <ul>n <li>list item 01</li>n <li>list item 02</li>n </ul>n ## compile and iterate through matches li_list_pat = re.compile(li_pat_str) for m in li_list_pat.finditer(txt):     print match group=, m.group(), m.span() ## printout: ## match group= <li>list item 01</li> (6, 27) ## match group= <li>list item 02</li> (28, 49)www.youtube.com/vkedco www.vkedco.blogspot.com
  32. 32. PL /g Quantifierwww.youtube.com/vkedco www.vkedco.blogspot.com
  33. 33. Outline ● /g quantifier is used after regular expression pat- terns, e.g., /pattern/g ● In the list context, /pattern/g returns an array of all pattern matches in the bound text ● In the scalar context, /pattern/g returns the next segment in the bound text that matches /pattern/www.youtube.com/vkedco www.vkedco.blogspot.com
  34. 34. Example my $txt = aaaaaa; my $pat = (aa); my @list = $txt =~ /$pat/g; ## this prints aa aa aa foreach (@list) {   print "$_ "; } print "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  35. 35. Using /g To Iterate Through Matches ## What if you need to iterate through all matches?  ## Here is a common way to do it. my $txt = <some string>; my $pat = <some pattern>; while ( $txt =~ /$pat/g ) {   ## do something with each consecutive match   ## when used in conjunction with /g, the    ## function pos($txt) returns the position    ## in $txt where the matching will resume }www.youtube.com/vkedco www.vkedco.blogspot.com
  36. 36. Example 01 ## Suppose we have some pattern $pat and we want to find out how many times  ## $pat matched some text $txt and print the start position of each match ­  ## essentially, an equivalent of findall in Python: sub print_all_match_positions {   my ($txt, $pat) = @_;   while ( $txt =~ /$pat/g ) {     ## pos($txt) returns the position in $txt where     ## the matching will resume     print "match at ", pos($txt) ­ length($pat), "n";   } } print_all_match_positions($txt, aa); print "n"; print_all_match_positions($txt, aaa); print "n"; print_all_match_positions($txt, aaaa); print "n";www.youtube.com/vkedco www.vkedco.blogspot.com
  37. 37. Example 02 ## Suppose we have some pattern $pat and we want to find out how many times  ## $pat matched some text $txt and return the list of the start position  ## of each match sub find_all_match_positions2 {   my ($txt, $pat) = @_;   my @rslt = ();   while ( $txt =~ /$pat/g ) {     ## pos($txt) returns the position in $txt where     ## the matching will resume     push(@rslt, pos($txt)­length($pat));   }   return @rslt; }www.youtube.com/vkedco www.vkedco.blogspot.com
  38. 38. Case Study: HTML Form Input Verificationwww.youtube.com/vkedco www.vkedco.blogspot.com
  39. 39. Problem Use regular expressions to verify the validity of user names and phone numbers submitted in an HTML Post formwww.youtube.com/vkedco www.vkedco.blogspot.com
  40. 40. HTML Post Form <html>   <head><title>Registration Form</title></head>   <body>   <form method = "post" action = "form_processor.pl">     <p>First name: <input name = "first_name" type = "text" size ="30"></p>     <p>Last name: <input name = "last_name" type = "text" size ="30"></p>     <p>Phone number:<input name = "phone_number" type = "text" size ="30"></p>   <input type = "submit" value = "Register">   <input type = "reset"  value = "Clear">   </form>  </body> </html>www.youtube.com/vkedco www.vkedco.blogspot.com
  41. 41. Possible Phone Number Pattern # (?:1(.| |­))?  # ?:          ­ do not bind this subexpression to a group # 1(.| |­))  ­ match 1, then match . or space or ­ # 1(.| |­))? ­ matching 1(.| |­) is optional (?:1(.| |­))?(d{3}|(d{3}))(?:.| |­)(d{3})(?:|.| |­)(d{4});www.youtube.com/vkedco www.vkedco.blogspot.com
  42. 42. Possible User Name Patterns my $first_name_pat = [A­Z](w|­)+; my $last_name_pat  = [A­Z](w|­)+;www.youtube.com/vkedco www.vkedco.blogspot.com
  43. 43. References ● www.python.org ● http://docs.python.org/2/ ● www.perl.org ● http://perldoc.perl.org/www.youtube.com/vkedco www.vkedco.blogspot.com

×