在引用的csv中匹配未转义的引号

时间:2017-04-26 01:51:53

标签: python regex csv regex-lookarounds

我已经查看了几个具有相似标题的Stack Overflow帖子,并且没有一个已接受的答案为我做了诀窍。

我有一个CSV文件,其中每个" cell"数据由逗号分隔并引用(包括数字)。每行以新行字符结尾。

一些文字"细胞"在它们中有引号,我想使用正则表达式来找到它们,以便我可以正确地逃避它们。

示例行:

choices

我想匹配"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60"","AD"8"\n "中的 E 60" ,而不是AD"8中的任何其他"

我可以使用什么(最好是Python友好的)正则表达式?

2 个答案:

答案 0 :(得分:1)

编辑:更新了@sundance的正则表达式,以避免开始行和换行。

您可以尝试仅替换逗号,行首或换行旁边的引号:

---
output: 
  html_document:
    toc: true
---
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library(DT)
library(htmltools)
```
```{r ,include = FALSE}
DT::datatable(iris)
```
## level 2 heading 0 - this one in TOC

```{r echo=FALSE, message=FALSE, warning=FALSE, results = 'asis'}
for (i in 1:2){
  cat("  \n## level 2 heading", i, "  \n")
   print(htmltools::tagList(DT::datatable(iris)))
  cat("  \n")
}
```

答案 1 :(得分:0)

这不是使用正则表达式,而是使用Python的字符串函数来查找和转义字符串的左右引号之间的引号。

它使用字符串的.find().rfind()方法查找周围的"个字符。然后它会替换外部引号内出现的任何其他"个字符。这样做不会假设,分隔符之间的周围引号位置,因此它会使任何周围的空格保持不变(例如,它会在每行的末尾留下'\n' - 是)。

def escape_internal_quotes(item):
    left = item.find('"') + 1
    right = item.rfind('"')
    if left < right:
        # only do the substitution if two surrounding quotes are found
        item = item[:left] + item[left:right].replace('"', '\\"') + item[right:]
    return item

line = '"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60"","AD"8"\n'
escaped = [escape_internal_quotes(item) for item in line.split(',')]
print(repr(','.join(escaped)))

导致:

'"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60\\"","AD\\"8"\n'