# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"((?<= )[\w .]+$)(?=.*(?<= )(\1 )$)"
test_str = ( "src/test/resources\n "
"|-- WPCDPS\n "
"| `-- RiskIndicatorsEvaluationRuleTest.feature\n "
"|-- Accelerated.feature\n "
"|-- AcceptedAFS.feature\n "
"|-- AgeValidationRemoval.feature\n "
"|-- Anxiety.feature\n "
"|-- CheckDisabledOccupation.feature\n "
"|-- Extended.feature\n "
"|-- Financal.feature\n "
"|-- Fainancial.feature\n "
"|-- FloridaSpecific.feature\n "
"|-- Hypertension.feature\n "
"|-- LifeForceOrPending.feature\n "
"|-- LifestyleInformation.feature\n "
"|-- MinValue.feature\n "
"|-- Occupations\n "
"| |-- OccupationTranslation.feature\n "
"| |-- OccupationsWithPreConditions.feature\n "
"| |-- Accelerated.feature\n "
"| `-- OccupationsWithoutPreConditions.feature\n "
"|-- Florida.feature" )
matches = re .finditer ( regex, test_str, re .MULTILINE | re .DOTALL )
for matchNum, match in enumerate ( matches) :
matchNum = matchNum + 1
print ( "Match {matchNum} was found at {start}-{end}: {match}" .format ( matchNum = matchNum, start = match.start ( ) , end = match.end ( ) , match = match.group ( ) ) )
for groupNum in range ( 0 , len ( match.groups ( ) ) ) :
groupNum = groupNum + 1
print ( "Group {groupNum} found at {start}-{end}: {group}" .format ( groupNum = groupNum, start = match.start ( groupNum) , end = match.end ( groupNum) , group = match.group ( groupNum) ) )
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
IyBjb2Rpbmc9dXRmOAojIHRoZSBhYm92ZSB0YWcgZGVmaW5lcyBlbmNvZGluZyBmb3IgdGhpcyBkb2N1bWVudCBhbmQgaXMgZm9yIFB5dGhvbiAyLnggY29tcGF0aWJpbGl0eQoKaW1wb3J0IHJlCgpyZWdleCA9IHIiKCg/PD0gKVtcdy5dKyQpKD89LiooPzw9ICkoXDEpJCkiCgp0ZXN0X3N0ciA9ICgic3JjL3Rlc3QvcmVzb3VyY2VzXG4iCgkifC0tIFdQQ0RQU1xuIgoJInwgICBgLS0gUmlza0luZGljYXRvcnNFdmFsdWF0aW9uUnVsZVRlc3QuZmVhdHVyZVxuIgoJInwtLSBBY2NlbGVyYXRlZC5mZWF0dXJlXG4iCgkifC0tIEFjY2VwdGVkQUZTLmZlYXR1cmVcbiIKCSJ8LS0gQWdlVmFsaWRhdGlvblJlbW92YWwuZmVhdHVyZVxuIgoJInwtLSBBbnhpZXR5LmZlYXR1cmVcbiIKCSJ8LS0gQ2hlY2tEaXNhYmxlZE9jY3VwYXRpb24uZmVhdHVyZVxuIgoJInwtLSBFeHRlbmRlZC5mZWF0dXJlXG4iCgkifC0tIEZpbmFuY2FsLmZlYXR1cmVcbiIKCSJ8LS0gRmFpbmFuY2lhbC5mZWF0dXJlXG4iCgkifC0tIEZsb3JpZGFTcGVjaWZpYy5mZWF0dXJlXG4iCgkifC0tIEh5cGVydGVuc2lvbi5mZWF0dXJlXG4iCgkifC0tIExpZmVGb3JjZU9yUGVuZGluZy5mZWF0dXJlXG4iCgkifC0tIExpZmVzdHlsZUluZm9ybWF0aW9uLmZlYXR1cmVcbiIKCSJ8LS0gTWluVmFsdWUuZmVhdHVyZVxuIgoJInwtLSBPY2N1cGF0aW9uc1xuIgoJInwgICB8LS0gT2NjdXBhdGlvblRyYW5zbGF0aW9uLmZlYXR1cmVcbiIKCSJ8ICAgfC0tIE9jY3VwYXRpb25zV2l0aFByZUNvbmRpdGlvbnMuZmVhdHVyZVxuIgoJInwgICB8LS0gQWNjZWxlcmF0ZWQuZmVhdHVyZVxuIgoJInwgICBgLS0gT2NjdXBhdGlvbnNXaXRob3V0UHJlQ29uZGl0aW9ucy5mZWF0dXJlXG4iCgkifC0tIEZsb3JpZGEuZmVhdHVyZSIpCgptYXRjaGVzID0gcmUuZmluZGl0ZXIocmVnZXgsIHRlc3Rfc3RyLCByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwpCgpmb3IgbWF0Y2hOdW0sIG1hdGNoIGluIGVudW1lcmF0ZShtYXRjaGVzKToKICAgIG1hdGNoTnVtID0gbWF0Y2hOdW0gKyAxCiAgICAKICAgIHByaW50ICgiTWF0Y2gge21hdGNoTnVtfSB3YXMgZm91bmQgYXQge3N0YXJ0fS17ZW5kfToge21hdGNofSIuZm9ybWF0KG1hdGNoTnVtID0gbWF0Y2hOdW0sIHN0YXJ0ID0gbWF0Y2guc3RhcnQoKSwgZW5kID0gbWF0Y2guZW5kKCksIG1hdGNoID0gbWF0Y2guZ3JvdXAoKSkpCiAgICAKICAgIGZvciBncm91cE51bSBpbiByYW5nZSgwLCBsZW4obWF0Y2guZ3JvdXBzKCkpKToKICAgICAgICBncm91cE51bSA9IGdyb3VwTnVtICsgMQogICAgICAgIAogICAgICAgIHByaW50ICgiR3JvdXAge2dyb3VwTnVtfSBmb3VuZCBhdCB7c3RhcnR9LXtlbmR9OiB7Z3JvdXB9Ii5mb3JtYXQoZ3JvdXBOdW0gPSBncm91cE51bSwgc3RhcnQgPSBtYXRjaC5zdGFydChncm91cE51bSksIGVuZCA9IG1hdGNoLmVuZChncm91cE51bSksIGdyb3VwID0gbWF0Y2guZ3JvdXAoZ3JvdXBOdW0pKSkKCiMgTm90ZTogZm9yIFB5dGhvbiAyLjcgY29tcGF0aWJpbGl0eSwgdXNlIHVyIiIgdG8gcHJlZml4IHRoZSByZWdleCBhbmQgdSIiIHRvIHByZWZpeCB0aGUgdGVzdCBzdHJpbmcgYW5kIHN1YnN0aXR1dGlvbi4K