如何 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:(.*)
,我相信它接近我需要的,但它将 30
和 556555
分成了不同的组。但是,-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+)?)
在这种情况下,如果需要,您还可以使用 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')]
我正在开发一个 Python 程序来搜索收到的电子邮件和 returns 坐标。我正在尝试为 select 字符串中的 Lat/long 值创建一个正则表达式。 (我是正则表达式的新手)
这是我一直用于测试的字符串之一的小示例:
content = """
WorkLocationBoundingBox
Latitude:30.556555Longitude:-97.659824
SecondLatitude:30.569138SecondLongitude:-97.650855
"""
我想出了 Latitude:(\d+).(\d+)Longitude:(.*)
,我相信它接近我需要的,但它将 30
和 556555
分成了不同的组。但是,-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+)?)
在这种情况下,如果需要,您还可以使用 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')]