我应该如何使这些正则表达式捕获组更简洁?

How should I make these regex capture groups more succinct?

我正在使用 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.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 返回的匹配列表将始终与它们在源文本中的顺序相同,请参阅