Django中的正则表达式

It'*_* me 0 python regex django

我将从查询中获取输出,如:

[ (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)'), (14577692L, 'POINT(-122.106035882 37.397386475)') ]
Run Code Online (Sandbox Code Playgroud)

我想单独获取POINT值以使用正则表达式获取lat和long值.

_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) 
Run Code Online (Sandbox Code Playgroud)

我的正则表达是错误的.有人可以帮我纠正这个:

_RE = re.compile('\(\([\d\-\., ]*\)\)'))
Run Code Online (Sandbox Code Playgroud)

Air*_*Air 5

这不需要正则表达式.因为POINT()静态的格式,您可以简单地切出包含坐标的字符串部分并将其拆分在空格上:

 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)
Run Code Online (Sandbox Code Playgroud)

切片表示法[6:-1]省略了前6个字符和原始字符串的最后一个字符,分别是POINT().这留下了两个用空格分隔的数字,这很容易处理,如上所述.

如果绝对必须使用正则表达式,则应使用原始字符串以避免必须两次转义字符,并使用两个捕获组,以便区分第一个和第二个坐标:

>>> 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')
Run Code Online (Sandbox Code Playgroud)

尽管如此,即使是那个正则表达式也是过度的.因为你知道POINT()静态的格式,你可以自己查找值,忽略字母和parens:

>>> _RE = re.compile(r'([-\d\.]+)\s([-\d\.]+)')
>>> _RE.search('POINT(-122.106035882 37.397386475)').groups()
('-122.106035882', '37.397386475')
Run Code Online (Sandbox Code Playgroud)

在这一点上,它变得足够简单,指出你根本不需要正则表达式的可能性(我已经展示过).质疑使用re和考虑更简单的替代品的必要性并不是一个坏主意.