Repository: nteract/papermill

Issue:
Azure blob storage handler wrong regex matching
## 🐛 Bug
on `abs.py`, the class `AzureBlobStore` has a function to extract container name, blob name, sas token etc.

```python
    @classmethod
    def _split_url(self, url):
        """
        see: https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1  # noqa: E501
        abs://myaccount.blob.core.windows.net/sascontainer/sasblob.txt?sastoken
        """
        match = re.match(r"abs://(.*)\.blob\.core\.windows\.net\/(.*)\/(.*)\?(.*)$", url)
        if not match:
            raise Exception("Invalid azure blob url '{0}'".format(url))
        else:
            params = {
                "account": match.group(1),
                "container": match.group(2),
                "blob": match.group(3),
                "sas_token": match.group(4),
            }
            return params
```
The regex is not working for a URI like (include a prefix with no blob specified, _experiments_ is the container name and other fields are virtual directory names, _evaluations_ directory includes a bunch of notebooks to read): **abs://sitaml5935191882.blob.core.windows.net/experiments/Experiment_job-20220308121849-98040e95-8bb0-4d3d-8364-d05e10b2f9/Experiment_2-20220308121840-d163f7b4-512f-4826-bc27-4140ae0cbbaf/evaluations?sas_token**

because the _container_ matching group has greedy matching and it matches all the _blob_ -> "experiments/Experiment_job-20220308121849-98040e95-8bb0-4d3d-8364-d05e10b2f9/Experiment_2-20220308121840-d163f7b4-512f-4826-bc27-4140ae0cbbaf" rather than only matching -> "experiments". 

The correct regex should be like -> "abs://(.*)\.blob\.core\.windows\.net\/(.*?)\/(.*)\?(.*)$"
<!-- A clear and concise description of what the bug is. -->


Discussion:
quancore: @MSeal can you review the pull request?

Patch:
diff --git a/papermill/abs.py b/papermill/abs.py
index aa1c88a..700164f 100644
--- a/papermill/abs.py
+++ b/papermill/abs.py
@@ -30,7 +30,7 @@ class AzureBlobStore(object):
         see: https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1  # noqa: E501
         abs://myaccount.blob.core.windows.net/sascontainer/sasblob.txt?sastoken
         """
-        match = re.match(r"abs://(.*)\.blob\.core\.windows\.net\/(.*)\/(.*)\?(.*)$", url)
+        match = re.match(r"abs://(.*)\.blob\.core\.windows\.net\/(.*?)\/(.*)\?(.*)$", url)
         if not match:
             raise Exception("Invalid azure blob url '{0}'".format(url))
         else:


Test patch:
diff --git a/papermill/tests/test_abs.py b/papermill/tests/test_abs.py
index 2fbc20c..d5b2124 100644
--- a/papermill/tests/test_abs.py
+++ b/papermill/tests/test_abs.py
@@ -50,6 +50,15 @@ class ABSTest(unittest.TestCase):
         self.assertEqual(params["blob"], "sasblob.txt")
         self.assertEqual(params["sas_token"], "sastoken")
 
+    def test_split_url_splits_valid_url_with_prefix(self):
+        params = AzureBlobStore._split_url(
+            "abs://myaccount.blob.core.windows.net/sascontainer/A/B/sasblob.txt?sastoken"
+        )
+        self.assertEqual(params["account"], "myaccount")
+        self.assertEqual(params["container"], "sascontainer")
+        self.assertEqual(params["blob"], "A/B/sasblob.txt")
+        self.assertEqual(params["sas_token"], "sastoken")
+
     def test_listdir_calls(self):
         self.assertEqual(
             self.abs.listdir(