We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[capture-col] When nothing is captured, "IndexError: list index out of range" is thrown
_Minor user exp bug_

**Small description**
When using `capture-col` on a column and the regex does not capture any values, the below error is thrown. No new column is created (as expected)

**Expected result**
Just to show the "no columns to add" error. Preferably, change the error to something more informative such as "no matches found, didn't add column"

**Actual result with screenshot**
```
Traceback (most recent call last):
  File "/Users/geekscrapy7/lib/python3.7/site-packages/visidata/threads.py", line 200, in _toplevelTryFunc
    t.status = func(*args, **kwargs)
  File "/Users/geekscrapy7/lib/python3.7/site-packages/visidata/features/regex.py", line 77, in addRegexColumns
    vs.addColumnAtCursor(*cols.values())
  File "/Users/geekscrapy7/lib/python3.7/site-packages/visidata/sheets.py", line 473, in addColumnAtCursor
    firstnewcol = [c for c in cols if not c.hidden][0]
IndexError: list index out of range
```
I presume this error is from an insufficient catch of an exception and it is attempting to create the column even though there are no groups to show.

**Steps to reproduce with sample data and a .vd**
`# echo -e 'helloooo\nthere' | vd -f txt --config=/dev/null --visidata_dir=/dev/null`

```tsv
sheet	col	row	longname	input	keystrokes	comment
-	text		capture-col	(ABC)	;	add new column from capture groups of regex; requires example row
```

**Additional context**
v2.12dev

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `visidata/features/regex.py`
Content:
```
1 import re
2 import random
3 
4 from visidata import asyncthread, options, vd
5 from visidata import VisiData, BaseSheet, Sheet, Column, Progress
6 
7 
8 @Sheet.api
9 def setSubst(sheet, cols, rows):
10     if not rows:
11         vd.warning('no %s selected' % sheet.rowtype)
12         return
13     modified = 'column' if len(cols) == 1 else 'columns'
14     rex = vd.input("transform %s by regex: " % modified, type="regex-subst")
15     setValuesFromRegex(cols, rows, rex)
16 
17 
18 vd.option('regex_flags', 'I', 'flags to pass to re.compile() [AILMSUX]', replay=True)
19 vd.option('regex_maxsplit', 0, 'maxsplit to pass to regex.split', replay=True)
20 
21 @VisiData.api
22 def makeRegexSplitter(vd, regex, origcol):
23     return lambda row, regex=regex, origcol=origcol, maxsplit=options.regex_maxsplit: regex.split(origcol.getDisplayValue(row), maxsplit=maxsplit)
24 
25 @VisiData.api
26 def makeRegexMatcher(vd, regex, origcol):
27     def _regexMatcher(row):
28         m = regex.search(origcol.getDisplayValue(row))
29         if m:
30             return m.groupdict() if m.groupdict() else m.groups()
31     return _regexMatcher
32 
33 
34 @Sheet.api
35 def RegexColumn(vs, regexMaker, origcol, regexstr):
36     regex = re.compile(regexstr, vs.regex_flags())
37     func = regexMaker(regex, origcol)
38     return Column(origcol.name+'_re',
39                   getter=lambda col,row,func=func: func(row),
40                   origCol=origcol)
41 
42 
43 @Sheet.api
44 @asyncthread
45 def addRegexColumns(vs, regexMaker, origcol, regexstr):
46     regexstr or vd.fail('regex required')
47 
48     regex = re.compile(regexstr, vs.regex_flags())
49 
50     func = regexMaker(regex, origcol)
51 
52     cols = {}
53     ncols = 0  # number of new columns added already
54     for r in Progress(vs.getSampleRows()):
55         try:
56             m = func(r)
57             if not m:
58                 continue
59         except Exception as e:
60             vd.exceptionCaught(e)
61 
62         if isinstance(m, dict):
63             for name in m:
64                 if name in cols:
65                     continue
66                 cols[name] = Column(origcol.name+'_'+str(name),
67                                     getter=lambda col,row,name=name,func=func: func(row)[name],
68                                     origCol=origcol)
69         elif isinstance(m, (tuple, list)):
70             for _ in range(len(m)-len(cols)):
71                 cols[len(cols)] = Column(origcol.name+'_re'+str(len(cols)),
72                                          getter=lambda col,row,i=len(cols),func=func: func(row)[i],
73                                          origCol=origcol)
74         else:
75             raise TypeError("addRegexColumns() expects a dict, list, or tuple from regexMaker, but got a "+type(m).__name__)
76 
77     vs.addColumnAtCursor(*cols.values())
78 
79 
80 @VisiData.api
81 def regexTransform(vd, origcol, instr):
82     before, after = vd.parse_sed_transform(instr)
83     return lambda col,row,origcol=origcol,before=before,after=after,flags=origcol.sheet.regex_flags(): re.sub(before, after, origcol.getDisplayValue(row), flags=flags)
84 
85 
86 @VisiData.api
87 def parse_sed_transform(vd, instr):
88     i = indexWithEscape(instr, '/')
89     if i is None:
90         return instr, ''
91     else:
92         return instr[:i], instr[i+1:]
93 
94 
95 def indexWithEscape(s, char, escape_char='\\'):
96     i=0
97     while i < len(s):
98         if s[i] == escape_char:
99             i += 1
100         elif s[i] == char:
101             return i
102         i += 1
103 
104     return None
105 
106 
107 @asyncthread
108 def setValuesFromRegex(cols, rows, rex):
109     transforms = [vd.regexTransform(col, rex) for col in cols]
110     vd.addUndoSetValues(cols, rows)
111     for r in Progress(rows, 'replacing'):
112         for col, transform in zip(cols, transforms):
113             col.setValueSafe(r, transform(col, r))
114     for col in cols:
115         col.recalc()
116 
117 
118 @BaseSheet.api
119 def regex_flags(sheet):
120     'Return flags to pass to regex functions from options'
121     return sum(getattr(re, f.upper()) for f in sheet.options.regex_flags)
122 
123 
124 Sheet.addCommand(':', 'split-col', 'addRegexColumns(makeRegexSplitter, cursorCol, input("split regex: ", type="regex-split"))', 'Add new columns from regex split')
125 Sheet.addCommand(';', 'capture-col', 'addRegexColumns(makeRegexMatcher, cursorCol, input("capture regex: ", type="regex-capture"))', 'add new column from capture groups of regex; requires example row')
126 Sheet.addCommand('', 'addcol-split', 'addColumnAtCursor(RegexColumn(makeRegexSplitter, cursorCol, input("split regex: ", type="regex-split")))', 'Add column split by regex')
127 Sheet.addCommand('', 'addcol-capture', 'addColumnAtCursor(RegexColumn(makeRegexMatcher, cursorCol, input("capture regex: ", type="regex-capture")))', 'Add column captured by regex')
128 Sheet.addCommand('*', 'addcol-subst', 'addColumnAtCursor(Column(cursorCol.name + "_re", getter=regexTransform(cursorCol, input("transform column by regex: ", type="regex-subst"))))', 'add column derived from current column, replacing regex with subst (may include \1 backrefs)')
129 Sheet.addCommand('g*', 'setcol-subst', 'setSubst([cursorCol], someSelectedRows)', 'regex/subst - modify selected rows in current column, replacing regex with subst, (may include backreferences \\1 etc)')
130 Sheet.addCommand('gz*', 'setcol-subst-all', 'setSubst(visibleCols, someSelectedRows)', 'modify selected rows in all visible columns, replacing regex with subst (may include \\1 backrefs)')
131 
132 
133 vd.addMenuItems('''
134     Edit > Modify > selected cells > regex substitution > setcol-subst
135     Column > Add column > capture by regex > addcol-capture
136     Column > Add column > split by regex > addcol-split
137     Column > Add column > subst by regex > addcol-subst
138     Column > Split > split-col
139     Row > Select > by regex > current column > select-col-regex
140     Row > Select > by regex > all columns > select-cols-regex
141     Row > Unselect > by regex > current column > unselect-col-regex
142     Row > Unselect > by regex > all columns > unselect-cols-regex
143 ''')
144
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/visidata/features/regex.py b/visidata/features/regex.py
--- a/visidata/features/regex.py
+++ b/visidata/features/regex.py
@@ -24,6 +24,8 @@
 
 @VisiData.api
 def makeRegexMatcher(vd, regex, origcol):
+    if not regex.groups:
+        vd.fail('specify a capture group')  #1778
     def _regexMatcher(row):
         m = regex.search(origcol.getDisplayValue(row))
         if m:
@@ -74,6 +76,10 @@
         else:
             raise TypeError("addRegexColumns() expects a dict, list, or tuple from regexMaker, but got a "+type(m).__name__)
 
+    if not cols:
+        vd.warning("no regex matches found, didn't add column")
+        return
+
     vs.addColumnAtCursor(*cols.values())

{"golden_diff": "diff --git a/visidata/features/regex.py b/visidata/features/regex.py\n--- a/visidata/features/regex.py\n+++ b/visidata/features/regex.py\n@@ -24,6 +24,8 @@\n \n @VisiData.api\n def makeRegexMatcher(vd, regex, origcol):\n+    if not regex.groups:\n+        vd.fail('specify a capture group')  #1778\n     def _regexMatcher(row):\n         m = regex.search(origcol.getDisplayValue(row))\n         if m:\n@@ -74,6 +76,10 @@\n         else:\n             raise TypeError(\"addRegexColumns() expects a dict, list, or tuple from regexMaker, but got a \"+type(m).__name__)\n \n+    if not cols:\n+        vd.warning(\"no regex matches found, didn't add column\")\n+        return\n+\n     vs.addColumnAtCursor(*cols.values())\n", "issue": "[capture-col] When nothing is captured, \"IndexError: list index out of range\" is thrown\n_Minor user exp bug_\r\n\r\n**Small description**\r\nWhen using `capture-col` on a column and the regex does not capture any values, the below error is thrown. No new column is created (as expected)\r\n\r\n**Expected result**\r\nJust to show the \"no columns to add\" error. Preferably, change the error to something more informative such as \"no matches found, didn't add column\"\r\n\r\n**Actual result with screenshot**\r\n```\r\nTraceback (most recent call last):\r\n  File \"/Users/geekscrapy7/lib/python3.7/site-packages/visidata/threads.py\", line 200, in _toplevelTryFunc\r\n    t.status = func(*args, **kwargs)\r\n  File \"/Users/geekscrapy7/lib/python3.7/site-packages/visidata/features/regex.py\", line 77, in addRegexColumns\r\n    vs.addColumnAtCursor(*cols.values())\r\n  File \"/Users/geekscrapy7/lib/python3.7/site-packages/visidata/sheets.py\", line 473, in addColumnAtCursor\r\n    firstnewcol = [c for c in cols if not c.hidden][0]\r\nIndexError: list index out of range\r\n```\r\nI presume this error is from an insufficient catch of an exception and it is attempting to create the column even though there are no groups to show.\r\n\r\n**Steps to reproduce with sample data and a .vd**\r\n`# echo -e 'helloooo\\nthere' | vd -f txt --config=/dev/null --visidata_dir=/dev/null`\r\n\r\n```tsv\r\nsheet\tcol\trow\tlongname\tinput\tkeystrokes\tcomment\r\n-\ttext\t\tcapture-col\t(ABC)\t;\tadd new column from capture groups of regex; requires example row\r\n```\r\n\r\n**Additional context**\r\nv2.12dev\n", "before_files": [{"content": "import re\nimport random\n\nfrom visidata import asyncthread, options, vd\nfrom visidata import VisiData, BaseSheet, Sheet, Column, Progress\n\n\n@Sheet.api\ndef setSubst(sheet, cols, rows):\n    if not rows:\n        vd.warning('no %s selected' % sheet.rowtype)\n        return\n    modified = 'column' if len(cols) == 1 else 'columns'\n    rex = vd.input(\"transform %s by regex: \" % modified, type=\"regex-subst\")\n    setValuesFromRegex(cols, rows, rex)\n\n\nvd.option('regex_flags', 'I', 'flags to pass to re.compile() [AILMSUX]', replay=True)\nvd.option('regex_maxsplit', 0, 'maxsplit to pass to regex.split', replay=True)\n\n@VisiData.api\ndef makeRegexSplitter(vd, regex, origcol):\n    return lambda row, regex=regex, origcol=origcol, maxsplit=options.regex_maxsplit: regex.split(origcol.getDisplayValue(row), maxsplit=maxsplit)\n\n@VisiData.api\ndef makeRegexMatcher(vd, regex, origcol):\n    def _regexMatcher(row):\n        m = regex.search(origcol.getDisplayValue(row))\n        if m:\n            return m.groupdict() if m.groupdict() else m.groups()\n    return _regexMatcher\n\n\n@Sheet.api\ndef RegexColumn(vs, regexMaker, origcol, regexstr):\n    regex = re.compile(regexstr, vs.regex_flags())\n    func = regexMaker(regex, origcol)\n    return Column(origcol.name+'_re',\n                  getter=lambda col,row,func=func: func(row),\n                  origCol=origcol)\n\n\n@Sheet.api\n@asyncthread\ndef addRegexColumns(vs, regexMaker, origcol, regexstr):\n    regexstr or vd.fail('regex required')\n\n    regex = re.compile(regexstr, vs.regex_flags())\n\n    func = regexMaker(regex, origcol)\n\n    cols = {}\n    ncols = 0  # number of new columns added already\n    for r in Progress(vs.getSampleRows()):\n        try:\n            m = func(r)\n            if not m:\n                continue\n        except Exception as e:\n            vd.exceptionCaught(e)\n\n        if isinstance(m, dict):\n            for name in m:\n                if name in cols:\n                    continue\n                cols[name] = Column(origcol.name+'_'+str(name),\n                                    getter=lambda col,row,name=name,func=func: func(row)[name],\n                                    origCol=origcol)\n        elif isinstance(m, (tuple, list)):\n            for _ in range(len(m)-len(cols)):\n                cols[len(cols)] = Column(origcol.name+'_re'+str(len(cols)),\n                                         getter=lambda col,row,i=len(cols),func=func: func(row)[i],\n                                         origCol=origcol)\n        else:\n            raise TypeError(\"addRegexColumns() expects a dict, list, or tuple from regexMaker, but got a \"+type(m).__name__)\n\n    vs.addColumnAtCursor(*cols.values())\n\n\n@VisiData.api\ndef regexTransform(vd, origcol, instr):\n    before, after = vd.parse_sed_transform(instr)\n    return lambda col,row,origcol=origcol,before=before,after=after,flags=origcol.sheet.regex_flags(): re.sub(before, after, origcol.getDisplayValue(row), flags=flags)\n\n\n@VisiData.api\ndef parse_sed_transform(vd, instr):\n    i = indexWithEscape(instr, '/')\n    if i is None:\n        return instr, ''\n    else:\n        return instr[:i], instr[i+1:]\n\n\ndef indexWithEscape(s, char, escape_char='\\\\'):\n    i=0\n    while i < len(s):\n        if s[i] == escape_char:\n            i += 1\n        elif s[i] == char:\n            return i\n        i += 1\n\n    return None\n\n\n@asyncthread\ndef setValuesFromRegex(cols, rows, rex):\n    transforms = [vd.regexTransform(col, rex) for col in cols]\n    vd.addUndoSetValues(cols, rows)\n    for r in Progress(rows, 'replacing'):\n        for col, transform in zip(cols, transforms):\n            col.setValueSafe(r, transform(col, r))\n    for col in cols:\n        col.recalc()\n\n\n@BaseSheet.api\ndef regex_flags(sheet):\n    'Return flags to pass to regex functions from options'\n    return sum(getattr(re, f.upper()) for f in sheet.options.regex_flags)\n\n\nSheet.addCommand(':', 'split-col', 'addRegexColumns(makeRegexSplitter, cursorCol, input(\"split regex: \", type=\"regex-split\"))', 'Add new columns from regex split')\nSheet.addCommand(';', 'capture-col', 'addRegexColumns(makeRegexMatcher, cursorCol, input(\"capture regex: \", type=\"regex-capture\"))', 'add new column from capture groups of regex; requires example row')\nSheet.addCommand('', 'addcol-split', 'addColumnAtCursor(RegexColumn(makeRegexSplitter, cursorCol, input(\"split regex: \", type=\"regex-split\")))', 'Add column split by regex')\nSheet.addCommand('', 'addcol-capture', 'addColumnAtCursor(RegexColumn(makeRegexMatcher, cursorCol, input(\"capture regex: \", type=\"regex-capture\")))', 'Add column captured by regex')\nSheet.addCommand('*', 'addcol-subst', 'addColumnAtCursor(Column(cursorCol.name + \"_re\", getter=regexTransform(cursorCol, input(\"transform column by regex: \", type=\"regex-subst\"))))', 'add column derived from current column, replacing regex with subst (may include \\1 backrefs)')\nSheet.addCommand('g*', 'setcol-subst', 'setSubst([cursorCol], someSelectedRows)', 'regex/subst - modify selected rows in current column, replacing regex with subst, (may include backreferences \\\\1 etc)')\nSheet.addCommand('gz*', 'setcol-subst-all', 'setSubst(visibleCols, someSelectedRows)', 'modify selected rows in all visible columns, replacing regex with subst (may include \\\\1 backrefs)')\n\n\nvd.addMenuItems('''\n    Edit > Modify > selected cells > regex substitution > setcol-subst\n    Column > Add column > capture by regex > addcol-capture\n    Column > Add column > split by regex > addcol-split\n    Column > Add column > subst by regex > addcol-subst\n    Column > Split > split-col\n    Row > Select > by regex > current column > select-col-regex\n    Row > Select > by regex > all columns > select-cols-regex\n    Row > Unselect > by regex > current column > unselect-col-regex\n    Row > Unselect > by regex > all columns > unselect-cols-regex\n''')\n", "path": "visidata/features/regex.py"}], "after_files": [{"content": "import re\nimport random\n\nfrom visidata import asyncthread, options, vd\nfrom visidata import VisiData, BaseSheet, Sheet, Column, Progress\n\n\n@Sheet.api\ndef setSubst(sheet, cols, rows):\n    if not rows:\n        vd.warning('no %s selected' % sheet.rowtype)\n        return\n    modified = 'column' if len(cols) == 1 else 'columns'\n    rex = vd.input(\"transform %s by regex: \" % modified, type=\"regex-subst\")\n    setValuesFromRegex(cols, rows, rex)\n\n\nvd.option('regex_flags', 'I', 'flags to pass to re.compile() [AILMSUX]', replay=True)\nvd.option('regex_maxsplit', 0, 'maxsplit to pass to regex.split', replay=True)\n\n@VisiData.api\ndef makeRegexSplitter(vd, regex, origcol):\n    return lambda row, regex=regex, origcol=origcol, maxsplit=options.regex_maxsplit: regex.split(origcol.getDisplayValue(row), maxsplit=maxsplit)\n\n@VisiData.api\ndef makeRegexMatcher(vd, regex, origcol):\n    if not regex.groups:\n        vd.fail('specify a capture group')  #1778\n    def _regexMatcher(row):\n        m = regex.search(origcol.getDisplayValue(row))\n        if m:\n            return m.groupdict() if m.groupdict() else m.groups()\n    return _regexMatcher\n\n\n@Sheet.api\ndef RegexColumn(vs, regexMaker, origcol, regexstr):\n    regex = re.compile(regexstr, vs.regex_flags())\n    func = regexMaker(regex, origcol)\n    return Column(origcol.name+'_re',\n                  getter=lambda col,row,func=func: func(row),\n                  origCol=origcol)\n\n\n@Sheet.api\n@asyncthread\ndef addRegexColumns(vs, regexMaker, origcol, regexstr):\n    regexstr or vd.fail('regex required')\n\n    regex = re.compile(regexstr, vs.regex_flags())\n\n    func = regexMaker(regex, origcol)\n\n    cols = {}\n    ncols = 0  # number of new columns added already\n    for r in Progress(vs.getSampleRows()):\n        try:\n            m = func(r)\n            if not m:\n                continue\n        except Exception as e:\n            vd.exceptionCaught(e)\n\n        if isinstance(m, dict):\n            for name in m:\n                if name in cols:\n                    continue\n                cols[name] = Column(origcol.name+'_'+str(name),\n                                    getter=lambda col,row,name=name,func=func: func(row)[name],\n                                    origCol=origcol)\n        elif isinstance(m, (tuple, list)):\n            for _ in range(len(m)-len(cols)):\n                cols[len(cols)] = Column(origcol.name+'_re'+str(len(cols)),\n                                         getter=lambda col,row,i=len(cols),func=func: func(row)[i],\n                                         origCol=origcol)\n        else:\n            raise TypeError(\"addRegexColumns() expects a dict, list, or tuple from regexMaker, but got a \"+type(m).__name__)\n\n    if not cols:\n        vd.warning(\"no regex matches found, didn't add column\")\n        return\n\n    vs.addColumnAtCursor(*cols.values())\n\n\n@VisiData.api\ndef regexTransform(vd, origcol, instr):\n    before, after = vd.parse_sed_transform(instr)\n    return lambda col,row,origcol=origcol,before=before,after=after,flags=origcol.sheet.regex_flags(): re.sub(before, after, origcol.getDisplayValue(row), flags=flags)\n\n\n@VisiData.api\ndef parse_sed_transform(vd, instr):\n    i = indexWithEscape(instr, '/')\n    if i is None:\n        return instr, ''\n    else:\n        return instr[:i], instr[i+1:]\n\n\ndef indexWithEscape(s, char, escape_char='\\\\'):\n    i=0\n    while i < len(s):\n        if s[i] == escape_char:\n            i += 1\n        elif s[i] == char:\n            return i\n        i += 1\n\n    return None\n\n\n@asyncthread\ndef setValuesFromRegex(cols, rows, rex):\n    transforms = [vd.regexTransform(col, rex) for col in cols]\n    vd.addUndoSetValues(cols, rows)\n    for r in Progress(rows, 'replacing'):\n        for col, transform in zip(cols, transforms):\n            col.setValueSafe(r, transform(col, r))\n    for col in cols:\n        col.recalc()\n\n\n@BaseSheet.api\ndef regex_flags(sheet):\n    'Return flags to pass to regex functions from options'\n    return sum(getattr(re, f.upper()) for f in sheet.options.regex_flags)\n\n\nSheet.addCommand(':', 'split-col', 'addRegexColumns(makeRegexSplitter, cursorCol, input(\"split regex: \", type=\"regex-split\"))', 'Add new columns from regex split')\nSheet.addCommand(';', 'capture-col', 'addRegexColumns(makeRegexMatcher, cursorCol, input(\"capture regex: \", type=\"regex-capture\"))', 'add new column from capture groups of regex; requires example row')\nSheet.addCommand('', 'addcol-split', 'addColumnAtCursor(RegexColumn(makeRegexSplitter, cursorCol, input(\"split regex: \", type=\"regex-split\")))', 'Add column split by regex')\nSheet.addCommand('', 'addcol-capture', 'addColumnAtCursor(RegexColumn(makeRegexMatcher, cursorCol, input(\"capture regex: \", type=\"regex-capture\")))', 'Add column captured by regex')\nSheet.addCommand('*', 'addcol-subst', 'addColumnAtCursor(Column(cursorCol.name + \"_re\", getter=regexTransform(cursorCol, input(\"transform column by regex: \", type=\"regex-subst\"))))', 'add column derived from current column, replacing regex with subst (may include \\1 backrefs)')\nSheet.addCommand('g*', 'setcol-subst', 'setSubst([cursorCol], someSelectedRows)', 'regex/subst - modify selected rows in current column, replacing regex with subst, (may include backreferences \\\\1 etc)')\nSheet.addCommand('gz*', 'setcol-subst-all', 'setSubst(visibleCols, someSelectedRows)', 'modify selected rows in all visible columns, replacing regex with subst (may include \\\\1 backrefs)')\n\n\nvd.addMenuItems('''\n    Edit > Modify > selected cells > regex substitution > setcol-subst\n    Column > Add column > capture by regex > addcol-capture\n    Column > Add column > split by regex > addcol-split\n    Column > Add column > subst by regex > addcol-subst\n    Column > Split > split-col\n    Row > Select > by regex > current column > select-col-regex\n    Row > Select > by regex > all columns > select-cols-regex\n    Row > Unselect > by regex > current column > unselect-col-regex\n    Row > Unselect > by regex > all columns > unselect-cols-regex\n''')\n", "path": "visidata/features/regex.py"}]}