Противоположность строки. Шаблон в Python - PullRequest
3 голосов
/ 18 июня 2011

Я знаю, что шаблон может работать следующим образом:

x = Template("  Coordinates;     $o1;$o2;$o3;\n")
y = x.substitute(o1 = 23, o2 = 108, o3 = 655)

и y даст мне:

"  Coordinates;     23;108;655;\n"

Мне интересно, есть ли способ сделать обратное?что-то вроде моей готовой распаковки:

x = Template("  Coordinates;     $o1;$o2;$o3;\n")
y = "  Coordinates;     23;108;655;\n"
z = x.unpack(y)

и z возвращает что-то вроде:

["23","108","655"]

есть идеи?я должен вместо этого использовать регулярные выражения?

EDIT: Если использовать регулярные выражения, как бы я запрограммировал следующие 3 строки, чтобы они возвращали первое число и 6 конечных чисел?

   a = "   123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4"
   b = "    17;  Coord   ;  15.2940;  13.5010;  3; 1; 8; 8"
   c = "     5;  Coord   ;  19.1345;   0.6200;  1; 1; 7; 8"

Я попробовал это на тех, и, похоже, не смог заставить его работать:

>>> re.match('(\d+);  Coord   ;(\d+);(\d+);(\d+);(\d+);(\d+);(\d+)',a).groups()

РЕШЕНИЕ: Использование регулярных выражений учебник (спасибо ironchefpython):

>>> import re
>>> text = """
       123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4
        17;  Coord   ;  15.2940;  13.5010;  3; 1; 8; 8
         5;  Coord   ;  19.1345;   0.6200;  1; 1; 7; 8
    """
>>> coord = re.compile("\D*(\d+)\D+([\d\.]+)\D+([\d\.]+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)")
>>> coord.findall(text)
[('123','19.1335','3.5010','1','3','8','4'),('17','15.2940','13.5010','3','1','8','8'),('5','19.1345','0.6200','1','1','7','8')]

Ответы [ 3 ]

5 голосов
/ 18 июня 2011
>>> import re
>>> y="  Coordinates;     23;108;655;\n"
>>> re.match("  Coordinates;     (\d+);(\d+);(\d+);\n", y).groups()
('23', '108', '655')

Вы также можете сделать это, чтобы получить изложение значений

>>> re.match("  Coordinates;     (?P<o1>\d+);(?P<o2>\d+);(?P<o3>\d+);\n", y).groupdict()
{'o3': '655', 'o2': '108', 'o1': '23'}
2 голосов
/ 18 июня 2011

Что касается вашего редактирования, если вы хотите работать с регулярными выражениями, я очень рекомендую посмотреть учебник ;без какого-либо руководства регулярные выражения выглядят как несжимаемый мусор, и хотя другие люди могут писать для вас ваши регулярные выражения, вы должны хотя бы понять, что они делают.

При этом

>>> re.match(r"\D*(\d+)\D+([\d\.]+)\D+([\d\.]+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)", 
             "   123;  Coord   ;  19.1335;   3.5010;  1; 3; 8; 4").groups()
('123', '19.1335', '3.5010', '1', '3', '8', '4')
0 голосов
/ 18 июня 2011

Что вы можете сделать, это создать класс с вашим пользовательским шаблонным идентификатором, а затем использовать регулярное выражение для идентификации этих идентификаторов из создаваемых вами объектов. Вы хотите создать словарь для хранения этих пар значений идентификаторов, а затем в ваших (пользовательских) методах, таких как unpack, просто дать значения идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...