我已经查看了几个具有相似标题的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友好的)正则表达式?
答案 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'