我应该如何使这些正则表达式捕获组更简洁?
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 返回的匹配列表将始终与它们在源文本中的顺序相同,请参阅 。
我正在使用 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 返回的匹配列表将始终与它们在源文本中的顺序相同,请参阅