如何以元组形式返回多个正则表达式值

2024-07-04 05:16:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Python程序,它可以搜索收到的电子邮件并返回坐标。我试图创建一个正则表达式来从字符串中选择Lat/long值。(我对regex不熟悉)

下面是我用于测试的字符串之一的一个小示例:

     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)]

Tags: 字符串程序示例电子邮件contentlongregexlat
1条回答
网友
1楼 · 发布于 2024-07-04 05:16:33

您可以使用3个捕获组,其中第一个组用于匹配单词“不久”或“纬度”

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

Regex demoPython demo

import re
regex = r"((?:Second)?)Latitude:(-?\d+(?:\.\d+)?)\1Longitude:(-?\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返回元组列表中的组值:

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')]

相关问题 更多 >

    热门问题