For some reason I couldn't just run it as a normal df through the function but it produces the desired output. See below and let me know if this is an adequate solution.
It won't work on numbers in a single column as the first and last character is the same which will essentially remove it and give you nothing in its place. The solution I provided will work for any of the ones you listed in the original post and even if they are non matching (say [ with } as an example).
You can then just do it like the below? If you want it different then you'll have to specify your problem better.
library(dplyr)
#> Warning: package 'dplyr' was built under R version 3.6.3
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- data.frame(
v1 = c("<Lisbon>", "<London[12]>", "(London/Paris)", "[420-Tokyo]"),
v2 = c(1:4) # ***added a new column***
)
df2 <- df %>% mutate(v1 = gsub('^.|.$', '', unlist(v1)) %>% as.data.frame())
df2
#> . v2
#> 1 Lisbon 1
#> 2 London[12] 2
#> 3 London/Paris 3
#> 4 420-Tokyo 4
```
<sup>Created on 2020-09-27 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>