import re
regex = re.compile(r"[\r\n]+\s*\/\/.*TODO:+.*", flags=re.IGNORECASE)
test_str = ("angular\n"
" .module('mdKeyboard', ['material.components.bottomSheet'])\n"
" .directive('mdKeyboard', MdKeyboardDirective)\n"
" .provider('$mdKeyboard', MdKeyboardProvider);\n\n\n"
"function MdKeyboardDirective($mdKeyboard, $mdBottomSheet, $timeout, $injector, $log) {\n"
" return {\n"
" restrict: 'A',\n"
" require: '?ngModel',\n"
" scope: {\n"
" clickOutsideToClose: '=',\n"
" preserveScope: '=',\n"
" showInMobile: '='\n"
" },\n"
" link: function (scope, element, attrs, ngModelCtrl) {\n"
" if (!ngModelCtrl) {\n"
" return;\n"
" }\n\n"
" var bottomSheet;\n\n"
" // Don't show virtual keyboard in mobile devices (default)\n"
" //TODO: test detection and reimplement if neccessary\n"
" //TODO: dissolve dependency to UAParser if possible / use angular or material utils\n"
" if ($injector.has('UAParser')) {\n"
" var UAParser = $injector.get('UAParser');\n"
" var results = new UAParser().getResult();\n"
" var isMobile = results.device.type === 'mobile' || results.device.type === 'tablet';\n"
" isMobile = isMobile || (results.os && (results.os.name === 'Android'));\n"
" isMobile = isMobile || (results.os && (results.os.name === 'iOS'));\n"
" isMobile = isMobile || (results.os && (results.os.name === 'Windows Phone'));\n"
" isMobile = isMobile || (results.os && (results.os.name === 'Windows Mobile'));\n"
" if (isMobile && attrs.showInMobile !== true) {\n"
" return;\n"
" }\n"
" }\n\n"
" /*\n"
" ngVirtualKeyboardService.attach(elements[0], scope.config, function() {\n"
" $timeout(function() {\n"
" ngModelCtrl.$setViewValue(elements[0].value);\n"
" });\n"
" });\n"
" */\n\n"
" $log.debug(attrs);\n"
" element\n"
" .bind('focus', showKeyboard)\n"
" .bind('blur', hideKeyboard);\n\n"
" function showKeyboard() {\n"
" $log.info('showKeyboard');\n"
" bottomSheet = $mdBottomSheet\n"
" .show({\n"
" template: '<md-bottom-sheet class=\"md-grid\" layout=\"column\" ng-cloak>{{keyboard}}</md-bottom-sheet>',\n"
" controller: KeyboardController,\n"
" clickOutsideToClose: attrs.clickOutsideToClose || false,\n"
" preserveScope: attrs.preserveScope || true\n"
" })\n"
" .then(function () {\n\n"
" });\n"
" }\n\n"
" function hideKeyboard() {\n"
" $log.info('hideKeyboard');\n"
" if (bottomSheet) {\n"
" $mdBottomSheet.hide();\n"
" delete bottomSheet;\n"
" }\n"
" }\n\n"
" function KeyboardController($scope, $mdBottomSheet) {\n"
" $scope.keyboard = 'TEST';\n"
" }\n\n"
" // open bottomsheet with keyboard on focus TODO: and without backdrop\n"
" scope.keyboard = 'test';\n\n"
" // When navigation force destroys an interimElement, then\n"
" // listen and $destroy() that interim instance...\n"
" scope.$on('$destroy', function () {\n"
" $mdKeyboard.destroy();\n"
" });\n"
" }\n"
" };\n"
"}\n\n"
"function MdKeyboardProvider($$interimElementProvider) {\n"
" return $$interimElementProvider('$mdKeyboard')\n"
" .setDefaults({\n"
" options: keyboardDefaults\n"
" });\n\n"
" function keyboardDefaults() {\n"
" return {\n"
" themable: true,\n"
" layout: defaultLayout\n"
" };\n\n"
" function defaultLayout() {\n"
" // get default language\n"
" return 'en-us';\n"
" }\n"
" }\n"
"}\n")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} 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