# Nicole Kim, 2/9/2019, edited on 2/1/2021
import re

def num_30(str):
   # Current test checks if the string is '0' 
   pattern = "^10[01]$|^0$"   #notice that python does not want / /
   match = re.match(pattern, str)
   print ("string is either 0, 100, or 101: ", match != None)

def num_31(str):
   # Current test checks if the string is '0' 
   pattern = "^[01]*$"
   print ("string is a binary string:", re.match(pattern, str) != None)

# Pre-condition: input is a binary string, so you do not need to check if it's a binary or not.
def num_32(str):
   pattern = '^.*0$'
   print ("string is an even binary number:", re.match(pattern, str) != None)

def num_33(str):
   # Current test searches words with 'a' 
   pattern = "\w*[aeiou]\w*[aeiou]\w*"
   # Notice that python does not support /i in the pattern. 
   # Use re.I for case insensitive when you match(exact same) or search(has one or more)
   print ("there's a word at least two vowels:", re.search(pattern, str, re.I) != None)

def num_34(str):
   pattern = "^1[10]*0$"
   print ("even binary integer string:", re.match(pattern, str) != None)

def num_35(str):
   pattern = "^[10]*110[10]*$"
   print ("binary string including 110:", re.match(pattern, str) != None)

def num_36(str):
   pattern = ".{2,4}$"
   print ("length at least two, but at most four:", re.match(pattern, str, re.DOTALL) != None)

def num_37(str):
   pattern = "^\d{3}[- ]*\d{2}[- ]*\d{4}$"
   print ("valid social security number:", re.match(pattern, str) != None)

def num_38(str):
   # When you read multiline input such as "I\nAM\nSAM."
   # str = str.replace('\\n', '\n') # If you need this...
   pattern = "^\w*d\w*"
   
   # When you want to use /im options:
   d_search = re.search(pattern, str, re.I | re.MULTILINE)
   print ("first word with d on a line:", d_search != None)

def num_39(str):
   pattern = "^1[10]*1$|^0[10]*0$"
   print ("There's same number of 01 substrings as 10 substrings: ", re.match(pattern, str) != None)

while(True):
   input_num = input("Choose the exercise # (30 - 39 or -1 to terminate):")
   if input_num == '-1': exit("Good bye")
   input_str = input("Input string: ")
   try:
      eval("num_" + input_num)(input_str)
   except:
      pass
   print()
   
''' Sample Output
Choose the exercise # (30 - 39 or -1 to terminate):30
Input string: 100
string is either 0, 100, or 101:  True

Choose the exercise # (30 - 39 or -1 to terminate):30
Input string: 1000
string is either 0, 100, or 101:  False

Choose the exercise # (30 - 39 or -1 to terminate):39
Input string: 101
There's same number of 01 substrings as 10 substrings:  True

Choose the exercise # (30 - 39 or -1 to terminate):39
Input string: 100
There's same number of 01 substrings as 10 substrings:  False

Choose the exercise # (30 - 39 or -1 to terminate):39
Input string: 0
There's same number of 01 substrings as 10 substrings:  True

Choose the exercise # (31 - 40 or -1 to terminate):-1
Good bye

 ----jGRASP wedge2: exit code for process is 1.
 ----jGRASP: operation complete.

'''