Django 中的正则表达式
Regular Expression in Django
我将从查询中得到如下输出:
[ (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)') ]
我想分别获取 POINT 值以使用正则表达式来获取纬度和经度值。
_RE = re.compile('\(\([\d\-\., ]*\)\)')
for i in cursor.fetchall():
for p in _RE.findall(i[1]):
// I want latitude and longitude value from POINT(-122.106035882 37.397386475)
我的正则表达式是错误的。有人可以帮我改正这个吗:
_RE = re.compile('\(\([\d\-\., ]*\)\)'))
这不需要正则表达式。因为 POINT()
的格式是静态的,所以您可以简单地切出包含坐标的字符串部分并将它们拆分到 space:
resultset = [
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)')
]
for row in resultset:
coordinatestring = row[1][6:-1]
lat, lon = (float(x) for x in coordinatestring.split(' '))
do_something_with(lat, lon)
切片符号[6:-1]
省略了原始字符串的前6个字符和最后一个字符,分别为POINT(
和)
。剩下两个数字,用 space 分隔,这很容易像上面那样处理。
如果你绝对必须使用正则表达式,你应该使用原始字符串以避免两次转义字符,并使用两个捕获组以便你可以区分第一个和第二个坐标:
>>> import re
>>> _RE = re.compile(r'POINT\(([-\d\.]+)\s([-\d\.]+)\)')
>>> _RE.groups
2
>>> _RE.search('POINT(-122.106035882 37.397386475)').groups()
('-122.106035882', '37.397386475')
尽管如此,即使是正则表达式也有点矫枉过正;因为您知道 POINT()
的格式是静态的,所以您可以只查找值本身,忽略字母和括号:
>>> _RE = re.compile(r'([-\d\.]+)\s([-\d\.]+)')
>>> _RE.search('POINT(-122.106035882 37.397386475)').groups()
('-122.106035882', '37.397386475')
此时它变得足够简单,可以指出您根本不需要正则表达式的可能性(我已经展示过)。质疑使用 re
的必要性并考虑更简单的替代方案从来都不是一个坏主意。
更明确:
import re
p = re.compile(r"POINT\(([-\d\.]+)\s([-\d\.]+)\)")
data = [
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)')
]
for record in data:
lat, lon = p.search(record[1]).groups()
print lat, lon
结果:
-122.106035882 37.397386475
-122.106035882 37.397386475
-122.106035882 37.397386475
您还可以获取带有命名变量的字典:
p = re.compile(r"POINT\((?P<lat>[-\d\.]+)\s(?P<lon>[-\d\.]+)\)")
...
for record in data:
coordinates = p.match(record[1]).groupdict()
print coordinates
结果:
{'lat': '-122.106035882', 'lon': '37.397386475'}
{'lat': '-122.106035882', 'lon': '37.397386475'}
{'lat': '-122.106035882', 'lon': '37.397386475'}
POINT\((-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\)
尝试 this.See 演示。
https://regex101.com/r/sH8aR8/32
import re
p = re.compile(r'POINT\((-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\)', re.IGNORECASE | re.DOTALL)
test_str = "[ (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)') ]"
re.findall(p, test_str)
我将从查询中得到如下输出:
[ (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)') ]
我想分别获取 POINT 值以使用正则表达式来获取纬度和经度值。
_RE = re.compile('\(\([\d\-\., ]*\)\)')
for i in cursor.fetchall():
for p in _RE.findall(i[1]):
// I want latitude and longitude value from POINT(-122.106035882 37.397386475)
我的正则表达式是错误的。有人可以帮我改正这个吗:
_RE = re.compile('\(\([\d\-\., ]*\)\)'))
这不需要正则表达式。因为 POINT()
的格式是静态的,所以您可以简单地切出包含坐标的字符串部分并将它们拆分到 space:
resultset = [
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)')
]
for row in resultset:
coordinatestring = row[1][6:-1]
lat, lon = (float(x) for x in coordinatestring.split(' '))
do_something_with(lat, lon)
切片符号[6:-1]
省略了原始字符串的前6个字符和最后一个字符,分别为POINT(
和)
。剩下两个数字,用 space 分隔,这很容易像上面那样处理。
如果你绝对必须使用正则表达式,你应该使用原始字符串以避免两次转义字符,并使用两个捕获组以便你可以区分第一个和第二个坐标:
>>> import re
>>> _RE = re.compile(r'POINT\(([-\d\.]+)\s([-\d\.]+)\)')
>>> _RE.groups
2
>>> _RE.search('POINT(-122.106035882 37.397386475)').groups()
('-122.106035882', '37.397386475')
尽管如此,即使是正则表达式也有点矫枉过正;因为您知道 POINT()
的格式是静态的,所以您可以只查找值本身,忽略字母和括号:
>>> _RE = re.compile(r'([-\d\.]+)\s([-\d\.]+)')
>>> _RE.search('POINT(-122.106035882 37.397386475)').groups()
('-122.106035882', '37.397386475')
此时它变得足够简单,可以指出您根本不需要正则表达式的可能性(我已经展示过)。质疑使用 re
的必要性并考虑更简单的替代方案从来都不是一个坏主意。
更明确:
import re
p = re.compile(r"POINT\(([-\d\.]+)\s([-\d\.]+)\)")
data = [
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)'),
(14577692L, 'POINT(-122.106035882 37.397386475)')
]
for record in data:
lat, lon = p.search(record[1]).groups()
print lat, lon
结果:
-122.106035882 37.397386475
-122.106035882 37.397386475
-122.106035882 37.397386475
您还可以获取带有命名变量的字典:
p = re.compile(r"POINT\((?P<lat>[-\d\.]+)\s(?P<lon>[-\d\.]+)\)")
...
for record in data:
coordinates = p.match(record[1]).groupdict()
print coordinates
结果:
{'lat': '-122.106035882', 'lon': '37.397386475'}
{'lat': '-122.106035882', 'lon': '37.397386475'}
{'lat': '-122.106035882', 'lon': '37.397386475'}
POINT\((-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\)
尝试 this.See 演示。
https://regex101.com/r/sH8aR8/32
import re
p = re.compile(r'POINT\((-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)\)', re.IGNORECASE | re.DOTALL)
test_str = "[ (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)') ]"
re.findall(p, test_str)