【问题标题】:How should I make these regex capture groups more succinct?我应该如何使这些正则表达式捕获组更简洁?
【发布时间】:2021-12-14 19:51:52
【问题描述】:

我正在使用 python 的 re 库来执行此操作,但这是一个基本的正则表达式问题。

我收到一串没有空格的度-分-秒格式的坐标信息,我将其解析为离散坐标对以进行转换。

给我的字符串看起来像这样(例如假坐标):

102030N0102030E203040N0203040E304050N0304050E405060N0405060E

我是这样理解的:

coordstr = '102030N0102030E203040N0203040E304050N0304050E405060N0405060E'

coords = re.match(
    re.compile(r"^(\d+[NS]{1}\d+[EW]{1})(\d+[NS]{1}\d+[EW]{1})(\d+[NS]{1}\d+[EW]{1})(\d+[NS]{1}\d+[EW]{1})"),
    coordstr)

for x in coords.groups():
    print(x)

这给了我

102030N0102030E
203040N0203040E
304050N0304050E
405060N0405060E

并允许我将每个坐标对称为coords.group(1)coords.group(2) 等等。

所以它有效,但感觉我在模式中过于冗长。是否有更简洁的方法来使用其中一个捕获组来抓取行,并将遇到的每个匹配组添加到.groups()?我知道我可以通过蛮力字符串切片来做到这一点,但这似乎比它的价值更麻烦。

我已经阅读了this,但它似乎并没有解决我在这个问题中要解决的问题。

因为这是针对企业的,并且这些字符串描述了栅格边界,所以我将在引入正则表达式搜索之前验证字符串,如果未找到(或损坏)字符串,则回退到 gdal 对象。

【问题讨论】:

  • re.findall(r'\d+[NS]\d+[EW]', coordstr) 工作是否足够好?它只匹配字符串中的所有匹配项。或者,您是否还需要对字符串进行预验证,并且仅在字符串与此特定格式匹配时提取四个部分?
  • 效果很好。我可以依靠每次维护的顺序吗?因为这是针对企业的,并且这些字符串描述了栅格边界,所以我将在引入正则表达式搜索之前验证字符串,如果未找到(或损坏)字符串,则回退到 gdal 对象。

标签: python regex regex-group


【解决方案1】:

由于您将使用正则表达式预先验证要处理的字符串,因此您无需将 re.search / re.match 与具有相同模式的多个组一起使用,您可以使用 re.findall 来获取所有 \d+[NS]\d+[EW] 模式匹配你的字符串:

import re
coordstr = '102030N0102030E203040N0203040E304050N0304050E405060N0405060E'
coords = re.findall(r'\d+[NS]\d+[EW]', coordstr)
for x in coords:
    print(x)

输出:

102030N0102030E
203040N0203040E
304050N0304050E
405060N0405060E

请参阅Python demo

注意:re.findall 返回的匹配列表将始终与它们在源文本中的顺序相同,请参阅this SO post

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多