[英]How to handle embedded commas and quotes in a regular expression search string
我有一个CSV文件,我想转换
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, maecenas porttitor congue massa
至
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>consectetuer adipiscing elit</element>
<desc> maecenas porttitor congue massa</desc>
</text>
我可以通过以下搜索表达式来完成这个简单的案例:
^([^,]*),([^,]*),([^,]*),
^
-寻找行的开头 ([^,]*),
-查找零个或多个不是逗号的字符,后跟一个逗号并将其分组(执行3次) 并且替换表达式为:
<text>\n <name>$1</name>\n <element>$2</element>\n <desc>$3</desc>\n</test>\n
这适用于简单的情况。 但是,有时CSV中的一个值会嵌入逗号,在这种情况下,该值周围会带有引号。
Lorem ipsum dolor sit amet, "consectetuer, adipiscing elit", maecenas porttitor congue massa
因此,第二个值(将是一个<element>)应该以:
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>consectetuer, adipiscing elit</element>
<desc> maecenas porttitor congue massa</desc>
</text>
也就是说,<element>应该具有嵌入式逗号。 我不需要保留报价。
然后,使其变得更混乱,该字符串可能还包含引号,并用引号将其转义(或者至少这是从Google工作表生成并保存为CSV的CSV格式)
Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa
我要结束于:
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>and he said, "no way!", to my astonishment</element>
<desc> maecenas porttitor congue massa</desc>
</text>
因此,<element>应该具有嵌入式逗号和转义引号(已删除转义字符,这是第二个引号)。
我迷上了尝试创建搜索正则表达式的过程。
遵循以下原则应该可以:
^\s* ( " (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*))
基本上是相同的模式...重复了3次。 空格,后跟一个捕获组,该捕获组可以是一系列非逗号,或者最好是一个"
之后是(任何非"
)或""
,最后是一个引号。
您需要在下面的链接中选中“忽略空白”按钮。
使用{3}表示法而不是重复模式3次是可以的,甚至可以用来代替“”,但是我不确定如何通过UI进入重复的捕获组。
我不是视觉工作室代码专家。 但是我认为没有正则表达式就可以做到
以下python代码应该给一个想法
关键是忽略逗号,直到引号配对为止。
data = 'Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa'
items = data.split(',')
result = []
for i in range(len(items)):
if (len(result) == 0):
result.append(items[i])
continue
# If last item has odd number of quotes, it needs pairing - Ignore commas
if (result[-1].count('"') % 2):
# Append to last element
result[-1] += ',' + items[i]
else:
result.append(items[i])
print("\n".join(result))
输出量
Lorem ipsum dolor sit amet
"and he said, ""no way!"", to my astonishment"
maecenas porttitor congue massa
如果您需要有关代码的更多说明,请告诉我
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.