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)