import re
regex = re.compile(r"desc\s*\"(((?!\").)*)((?!\n).)*\n{1}task\s*:(((?!\n).)*)do(((?!\nend).)*)\nend", flags=re.DOTALL)
test_str = ("import 'cloud2/cloud2.rb'\n"
"desc \"transfer db from current location to local and new dev\"\n"
"task :fulldbtransfer => [ \n"
" :dbdown, :dbup, \n"
" :dbup_live,]\n"
"$comps_db = ['prube_yalecomps']\n"
"$tnew_dbs = [ 'prube_yaletnew_drama_prod',\n"
" 'prube_yaletnew_summer_cabaret_prod',\n"
" 'prube_yaletnew_cabaret_prod',\n"
" 'prube_yaletnew_music_prod',\n"
" 'prube_yaletnew_rep_prod']\n"
"$new_tnew_dbs = [ 'prube_yaletnew_drama',\n"
" 'prube_yaletnew_summer_cabaret',\n"
" 'prube_yaletnew_cabaret',\n"
" 'prube_yaletnew_music',\n"
" 'prube_yaletnew_rep']\n"
"all_erube_dbs = $comps_db + $tnew_dbs\n"
"desc \"Transfer Database, complete with tunnel setup and teardown\"\n"
"task :dbdown do\n"
" all_erube_dbs.each do |database_name|\n"
" cloud2_mysqldump do tunnel_host 'cumulus-www-master-pub.rs.lynch2.com'\n"
" tunnel_user 'www' db_host 'cumulus-db-master.rs.lynch2.com' skip_secure_auth true \n"
" db_user 'mysql'\n"
" db_pass 'mysql'\n"
" db_name \" file_prefix 'SOURCE_'\n"
" ignored_tables ['cache','hits','debug','sessionvars','sessions']\n"
" end \n"
" end\n"
"end\n\n"
"task :dbsandr do\n"
" dbname = \"prube_yalecomps\"\n"
" bucket_prefix = \"comps\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [ ]\n\n"
" replace_str [ ] end\n\n"
" dbname = \"prube_yaletnew_drama_prod\"\n"
" bucket_prefix = \"drame\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [\n"
" 'prube_yaletnew_drama_prod', ]\n\n"
" replace_str [\n"
" \"prube_yaletnew_drama\", ] end\n\n"
" dbname = \"prube_yaletnew_summer_cabaret_prod\"\n"
" bucket_prefix = \"summer-cabaret\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [\n"
" 'prube_yaletnew_summer_cabaret_prod', ]\n\n"
" replace_str [\n"
" 'prube_yaletnew_summer_cabaret', ] end\n\n\n"
" dbname = \"prube_yaletnew_cabaret_prod\"\n"
" bucket_prefix = \"cabaret\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [\n"
" 'prube_yaletnew_cabaret_prod', ]\n\n"
" replace_str [\n"
" 'prube_yaletnew_cabaret', ] end\n\n"
" dbname = \"prube_yaletnew_music_prod\"\n"
" bucket_prefix = \"music\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [\n"
" 'prube_yaletnew_music_prod', ]\n\n"
" replace_str [\n"
" 'prube_yaletnew_music', ] end\n\n"
" dbname = \"prube_yaletnew_rep_prod\"\n"
" bucket_prefix = \"rep\"\n"
" cloud2_sed do\n"
" source_file \"db-tools/SOURCE_mysqldump_ dest_file \"db-tools/CLOUD2_ \n"
" find_str [\n"
" 'prube_yaletnew_rep_prod', ]\n\n"
" replace_str [\n"
" 'prube_yaletnew_rep', ] end\n\n"
"end\n\n\n\n"
"desc \"Send Database to tigard-dev-rds\"\n"
"task :dbup do\n"
" upload_dbs \"reston-dev-rds.aws.lynch2.com\"\n"
"end\n\n"
"desc \"Send Database to tigard-mail2-rds\"\n"
"task :dbup_live do\n"
" upload_dbs \"reston-live-rds.aws.lynch2.com\"\n"
"end\n\n"
"def upload_dbs (dbhost)\n"
" $comps_db.each do |database_name| \n"
" cloud2_mysql do db_host dbhost\n"
" db_user 'mysql'\n"
" db_pass 'mysql'\n"
" db_name \"mysql\" sql_files [\"CLOUD2_ end \n"
" cloud2_mysql do db_host dbhost\n"
" db_user 'mysql'\n"
" db_pass 'mysql'\n"
" db_name \" sql_files [\"erube_upgrade.sql\"]\n"
" end \n"
" end\n"
" $new_tnew_dbs.each do |database_name| \n"
" cloud2_mysql do db_host dbhost\n"
" db_user 'mysql'\n"
" db_pass 'mysql'\n"
" db_name \"mysql\" sql_files [\"CLOUD2_ end \n"
" cloud2_mysql do db_host dbhost\n"
" db_user 'mysql'\n"
" db_pass 'mysql'\n"
" db_name \" sql_files [\"tnew_erube_upgrade.sql\"]\n"
" end \n"
" end\n"
"end\n")
match = regex.search(test_str)
if match:
print(f"Match was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html