import re
regex = re.compile(r"(\S*) && (\1[\.\[]).+", flags=re.MULTILINE)
test_str = ("// Optional chaining for Javascript is now in stage 4:\n"
"// https://github.com/tc39/proposal-optional-chaining\n"
"// WARNING: This is NOT native to JS yet, so you will need to use a babel plugin to convert it:\n"
"// https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining\n\n"
"// Which means you can use this regex to find where in your codebase you can replace this:\n"
"user && user.profile && user.profile.email\n"
"// with this:\n"
"user?.profile?.email\n\n"
"// these should match because they have an object variable being accessed multiple times with a dot or opening bracket\n"
"data && data[query] && data[query].items && data[query].items.length > 0\n"
"const street = user.address && user.address.street;\n\n"
"// this should not match because they're not accessing the same object\n"
"data && form.user && api.authenticated")
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