regex - 将多行文本括在特定正则表达式捕获组的引号内

标签 regex csv

我的输入是来自不同来源的文本,唯一一致的是它们都包含代码、纬度和经度。有时后面会附有有用的注释。

根据此输入,目标是生成带有标题行的 CSV 格式: 代码、名称、纬度、经度、注释、URL、注释

仅需要代码、纬度、经度和可能的注释

使用 PCRE2,替换字符串为 代码,,纬度,经度,"备注",,

$1,,$2,$3,"$4",,

我的 RE 几乎可以做我想做的事情了

(?mi)^.*?((?:\bGC)[A-Z0-9-]{1,10}).*?([N|S]\s?\d{1,2}°?\s+\d{1,2}\.\d{1,3}'?).*?([E|W]\s?\d{1,3}°?\s+\d{1,2}\.\d{1,3}'?)\s(.*)

您可以在 regex101 中查看我迄今为止的工作。

重点关注示例中的部分输出

GC8DH0G,,N 50° 50.456',W 001° 10.456',"Text to capture",,
Including line breaks and text, until the next GCcode
GC123GHF,,N 50 50.789,W 001 10.789,"etc.",,

唯一的附加要求是包含经度后面的所有多行文本,直到以下 GC 代码,也包含在带引号的捕获组 4 中。

所以上面的输出将变成

GC8DH0G,,N 50° 50.456',W 001° 10.456',"Text to capture
Including line breaks and text, until the next GCcode",,
GC123GHF,,N 50 50.789,W 001 10.789,"etc.",,

也就是说,所有文本,包括换行符\n 或\r\n 都用引号引起来。

最佳答案

"... My input is text from different sources and the only consistent thing is that they all contain a code, latitude and longitude. ..."

需要注意的是,资源通常会包含概述语法的文档。

无论如何,geographic coordinate 值有不同的表示法。
您在此处解析的值称为DDM,或“度,十进制分”
随后,有DMS,或“度、分、秒”
而且,还有DD,或decimal degrees

这是一个捕获模式
Unicode 代码点U+00b0,用于度数字符,°

(GC[A-Z\d]+).*?([NS] \d+\x{00b0}? \d+(?:\.\d+)?[^,\s]?),([EW] \d+\x{00b0}? \d+(?:\.\d+)?[^,\s]?|$)?
GC8EYCQ, N 50° 50.123, W 001° 10.123
GC8DH0G, N 50° 50.456', W 001° 10.456'
GC123GHF, N 50 50.789, W 001 10.789
GC123ABC, N 50 50.987, W 001 10.987

此外,这里有一个 DMS 值的模式

(GC[A-Z\d]+).*?([NS] \d+\x{00b0}? \d+[^ ]? \d+(?:\.\d+)?[^,\s]+),([EW] \d+\x{00b0}? \d+[^ ]? \d+(?:\.\d+)?[^,\s]+|$)?

"... The only additional requirement is to include all the multilines of text that follow the Longitude, up until the following GC code, also enclosed in quoted capture group 4. ..."

尝试以下操作。
本质上,如果坐标后面跟着除空格以外的任何内容,则捕获内容,直到下一个 GC 代码。

(?: *$|(?s) *(.+?)\s*(?=GC[A-Z\d]+))

这是重构。

(GC[A-Z\d]+).*?([NS] \d+\x{00b0}? \d+(?:\.\d+)?[^,\s]?),([EW] \d+\x{00b0}? \d+(?:\.\d+)?[^,\s]?|$)?(?: *$|(?s) *(.+?)\s*(?=GC[A-Z\d]+))

这是捕获的内容,我已将换行符替换为 \n

GC8EYCQ, N 50° 50.123, W 001° 10.123, ""
GC8DH0G, N 50° 50.456', W 001° 10.456', "Text to capture\nIncluding line breaks and text, until the next GCcode"
GC123GHF, N 50 50.789, W 001 10.789, "More multiline text \nthat must be enclose in quotes\nNot just the first line of text to capture"
GC123ABC, N 50 50.987, W 001 10.987, ""

关于regex - 将多行文本括在特定正则表达式捕获组的引号内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77567487/

相关文章:

使用 write.csv 导出数据帧时,用空格 (""或点 ("."替换缺失值(NA)

python - 在 python 中映射 csv

regex - nginx 匹配位置中的特定单词

正则表达式将选项值复制到 select 中的文本中

python - 如何在不更改特定列的情况下对数据框中的数据进行重新采样?

php - 使用 PHP 将 CSV 转换为 JSON?

java - 使用正则表达式将 WKT 转换为 GeoJSON

regex - 在 R 中提取字符串的一部分

java - 使用正则表达式格式化 csv

c# - 如何使用 FileHelpers 库从 csv 中只读取一定数量的字段?