2015-05-12 3 views
0

У меня есть строка Тат идет так:регулярное выражение вопрос с номерами (питон)

<123, 321> 

диапазон чисел может быть от 0 до 999.

Мне нужно вставить эти координаты как можно быстрее в две переменные, поэтому я подумал о регулярном выражении. Я уже разделил строку на две части, и теперь мне нужно изолировать целое число от всех других символов. Я попробовал этот шаблон:

^-?[0-9]+$ 

но вывод:

[] 

любая помощь? :)

+0

Может быть просто взять две подстроки: один от 1 до положения точки, а другой из положения от запятой + 2 до конца строки - 1. – Luke

+0

regex, вероятно, медленнее, чем вы думаете –

ответ

0

"^-?[0-9]+$" будет соответствовать только строке, содержащей номер и ничего больше.

Вы хотите, чтобы соответствовать группе и экстракт, который группа:

>>> pattern = re.compile("(-?[0-9]+)") 
>>> pattern.findall("<123, 321>") 
['123', '321'] 
1

Все, что вам нужно сделать, это избавиться от якорей (^ и $)

>>> import re 
>>> string = "<123, 321>" 
>>> re.findall(r"-?[0-9]+", string) 
['123', '321'] 
>>> 

Примечание^$ Якоря в начале и в конце узоров -?[0-9]+ гарантирует, что строка состоит только из цифр.

То есть механизм регулярных выражений пытается соответствовать шаблону с начала строки, используя ^-?[0-9]+ до конца строки $. Но это не удается, потому что < не может соответствовать -?[0-9]+

Где как re.findall найти все подстроки, которые соответствуют шаблону -?[0-9]+, то есть цифры.

+0

«строка состоит только из строк»? ваш ответ правильный, но эта часть сбивает с толку даже для ветерана регулярного выражения. – oxymor0n

+0

@ oxymor0n Извините, я не получил вас – nu11p01n73R

+0

Ваша заметка просто ... сбивает с толку, вот и все. Удаление якорей является правильным, но ваша заметка о том, почему это так, на самом деле не объясняет проблему. – oxymor0n

2

Если ваши строки в том же формате <123, 321>, то это должно быть немного быстрее, чем регулярное выражение подход

def str_translate(s): 
    return s.translate(None, " <>").split(',') 

In [52]: str_translate("<123, 321>") 
Out[52]: ['123', '321'] 
+1

Если '<>' всегда находятся в одном и том же месте, 's [1: -1]' будет немного быстрее, чем 'translate'. Вы можете разделить на '', '', если вам нужно избавиться от пространства. –

Смежные вопросы