【问题标题】:Extract coordinates from a string regex从字符串正则表达式中提取坐标
【发布时间】:2021-01-17 20:05:51
【问题描述】:

我正在尝试从 reddit cmets 中提取各种格式的坐标。我希望能够提取谷歌地图支持的两种不同坐标格式:

73.180633, -98.100802 和 73°10'50.3"N 98°06'02.9"W

我可以用这个表达式提取第一种格式的坐标:

([-+]?\d{1,2}[.]\d+),\s*([-+]?\d{1,3}[.]\d+)

但是,我无法成功找到或制作与第二种格式匹配的模式。

【问题讨论】:

  • 显示示例 reddit 评论...

标签: python regex coordinates


【解决方案1】:

这将适用于第二种格式:\d{1,3}°\d{1,3}'\d{1,3}\.\d\"[N|S]\s\d{1,3}°\d{1,3}'\d{1,3}\.\d\"[E|W]

见:https://regex101.com/r/LN1igj/8

有两个非常相似的组,显然无法简化。见How to capture multiple repeated groups?。

在一个正则表达式中捕获两种格式:(?:((?:[-+]?\d{1,2}[.]\d+),\s*(?:[-+]?\d{1,3}[.]\d+))|(\d{1,3}°\d{1,3}'\d{1,3}\.\d\"[N|S]\s\d{1,3}°\d{1,3}'\d{1,3}\.\d\"[E|W]))

见:https://regex101.com/r/LN1igj/7

但这不再是真正可读的了。我建议用代码解决这个问题。

【讨论】:

  • 乐于助人。感谢您接受答案并点赞。
  • 经度从 -180 到 +180。所以我认为您的 {2} 中至少有一个需要是 {2,3}
  • 有没有办法可以将我的两个表达式组合成一个表达式?我尝试使用 or (exp1 | exp2) 但这不起作用。两种格式都不匹配
  • @ChristianBaumann 似乎不适用于36°10'13.6"N 115°08'23.6"W,使用组合表达式进行测试
  • @rgmcode 更新:(?:((?:[-+]?\d{1,2}[.]\d+),\s*(?:[-+]?\d{1,3}[.]\d+))|(\d{2,3}°\d{2}'\d{2,3}\.\d\"[N|S]\s\d{2,3}°\d{2}'\d{2,3}\.\d\"[E|W]))regex101.com/r/LN1igj/4
【解决方案2】:
  • 纬度从 90S 90N 表示,经度从 0 到 180 表示。
  • 除了秒,度和分也可以有小数点,而不是更多的子单位。
  • 它也可以用 +/- 表示为十进制数

请尝试下面的正则表达式。

(^| )(-?\d{1,2}(\.\d+)?(?=\s*,?\s*)[\s,]+-?\d{1,3}(\.\d+)?|\d{1,2}(\.\d+°|°(\d{1,2}(\.\d+'|'(\d{1,2}(\.\d+)?\")?))?)[NS](?=\s*,?\s*)[\s,]+\d{1,3}(\.\d+°|°(\d{1,2}(\.\d+'|'(\d{1,2}(\.\d+)?\")?))?)[EW])

Demo

【讨论】:

  • 谢谢!这也适用于其他格式,例如 google earth 上的格式(由于某种原因,它使用与地图不同的 dms 和十进制),非常有用
猜你喜欢
  • 2020-12-19
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2018-02-23
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多