如何 return 多个正则表达式值作为一个元组

How to return multiple regex values as a tuple

我正在开发一个 Python 程序来搜索收到的电子邮件和 returns 坐标。我正在尝试为 select 字符串中的 Lat/long 值创建一个正则表达式。 (我是正则表达式的新手)

这是我一直用于测试的字符串之一的小示例:

     content = """

WorkLocationBoundingBox
Latitude:30.556555Longitude:-97.659824
SecondLatitude:30.569138SecondLongitude:-97.650855

     """

我想出了 Latitude:(\d+).(\d+)Longitude:(.*),我相信它接近我需要的,但它将 30556555 分成了不同的组。但是,-97.659824 被正确地放入了一个组。

我理想的预期结果应该是这样的:

[(30.556555, -97.659824, 30.569138, -97.650855)]

您可以使用 3 个捕获组,其中第一个组用于匹配 Long 或 Latitude 之前的单词。

((?:Second)?)Latitude:(-?\d+(?:\.\d+)?)Longitude:(-?\d+(?:\.\d+)?)
  • ((?:Second)?) 捕获组1,可选匹配Second
  • Latitude:字面匹配
  • (-?\d+(?:\.\d+)?) 捕获 组 2,匹配可选的 - 然后 1+ 位数字和可选的小数部分
  • Longitude: 对组 1 中匹配内容的反向引用并匹配 Longitude:
  • (-?\d+(?:\.\d+)?) 捕获 组 3,匹配可选的 - 然后 1+ 位数字和可选的小数部分

Regex demo or a Python demo

import re
regex = r"((?:Second)?)Latitude:(-?\d+(?:\.\d+)?)Longitude:(-?\d+(?:\.\d+)?)"
s = ("WorkLocationBoundingBox\n"
            "Latitude:30.556555Longitude:-97.659824\n"
            "SecondLatitude:30.569138SecondLongitude:-97.650855")

matches = re.finditer(regex, s)
lst = []

for matchNum, match in enumerate(matches, start=1):
     lst.append(match.group(2))
     lst.append(match.group(3))

print(lst)

输出

['30.556555', '-97.659824', '30.569138', '-97.650855']

不太严格的模式可以匹配经度或纬度之前的可选单词字符:

\w*Latitude:(-?\d+(?:\.\d+)?)\w*Longitude:(-?\d+(?:\.\d+)?)

Regex demo

在这种情况下,如果需要,您还可以使用 re.findall 来 return 元组列表中的组值:

import re

pattern = r"\w*Latitude:(-?\d+(?:\.\d+)?)\w*Longitude:(-?\d+(?:\.\d+)?)"

s = ("WorkLocationBoundingBox\n"
            "Latitude:30.556555Longitude:-97.659824\n"
            "SecondLatitude:30.569138SecondLongitude:-97.650855")
print(re.findall(pattern, s))

输出

[('30.556555', '-97.659824'), ('30.569138', '-97.650855')]