When grouping expressions together we need to use brackets. For example:
(abc|123)will match "abc" or "123". However, what if we would not like to include these in our matched groups? The answer is to use a non-matching group:
(?:abc|123)note the use of:
(?:.*some_regex.*)Example of the difference:

Without using a non-matching group we end up with 2 matching groups:

If this is not ideal and instead we use a non-matching group:

Then number of matching groups is reduced to only what we're interested in:

Note how we have only one matching group per line in the above screenshot compared to the two groups we had before
(?<=.*some_regex.*)Similar to "look ahead", but instead checks for the presence of an expression which comes before your matching group
(?=.*some_regex.*)A look about is very useful when you'd like your actual regex to match a particular expression only if some other condition is true, without actually matching the condition. For example, given the following test string:
key1=value 1 key2=value 2how would you extract the first key / value pair using a regex? Notice the lack of enclosing quotes which makes this exercise more difficult. One possible solution is:
(.*)=(.*)(?= .*=.*)
This uses the look about property to extract only the key (first .*) and value (second .*), but only until another keypair appears, without actually matching the next keypairThe converse of this (instead of looking forward, look backwards) is the look behind functionality