我的输入是来自不同来源的文本,唯一一致的是它们都包含一个代码,纬度和经度。这有时是有用的注解。
从这个输入中,目标是生成一个CSV格式,其标题行为:代码、名称、纬度、经度、注解、URL、注解
仅需要代码、纬度、经度和可能的注解,
使用PCRE 2时,替换字符串为Code,,Latitude,Longitude,“Notes”,,
$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.",,
型
唯一的额外要求是包括Longitude之后的所有多行文本,直到下面的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都用引号括起来。
2条答案
按热度按时间ffdz8vbo1#
需要注意的是,资源通常会包括概述语法的文档。
无论如何,有不同的符号用于 * geographic coordinate * 值。
这里解析的是 DDM,或 “degrees,decimal-minutes”。
随后,有 DMS,或 “度,分,秒”。
另外,还有 DD 或 ”decimal degrees“。
这是一个 * 捕获模式 *。
°
。个字符
此外,这里有一个 DMS 值的 * 模式 *。
型
尝试以下操作。
从本质上讲,如果坐标后面跟的不是空白,那么就捕获内容,直到下一个 GC 代码。
型
这里是re-factor。
型
下面是捕获,我已经用
\n
替换了新行的分隔符。oprakyz72#
尝试一下这个模式,使用PCRE自由空间模式和子例程定义。我借用了您的代码来定义纬度和经度(按照@Reilas的建议将
°
更改为\x{00b0}
)。字符串
替换为:
型
参见https://regex101.com/r/2a7AG7/latest
如果你需要删除CSV中的空行,进一步用空字符串替换
^$\n
。参见https://regex101.com/r/Mj6rH7/latest