2013-07-31 3 views
-1

Как вернуть упорядоченный список из регулярного выражения? Еще один вид регулярного выражения.Regex Python с заказом для OR | pattern

Например, скажем, у меня есть список = [a, b, c, c, b, a, g], и я хочу иметь все сначала b, а затем a, а затем - a в списке. Как это сделать для регулярного выражения?

Я думал: шаблон = re.compile ('Ь | с | а') [письмо для письма в списке, если pattern.match (письмо)]

, но это просто выходит [ 'а ',' b ',' c ',' c ',' b ',' a ']

Что я хочу, это [' b ',' b ',' c ',' c ',' a ' , 'a']

как это будет возможно? Благодаря!

+3

сортировка на самом деле не внимание регулярного выражения, почему бы просто не отсортировать результат в python? – hago

+2

Прежде чем кто-то обязательно придумает эзотерический метод для этого, используя регулярное выражение, сначала спросите, является ли regex инструментом, который вы хотите использовать для этой работы. (Подсказка: нет) – roippi

+1

Я думаю, вы должны использовать алгоритм сортировки, а не регулярное выражение: http://docs.python.org/2/library/functions.html#sorted посмотреть на аргумент cmp этой функции – tuxtimo

ответ

0

Вместо regex можно использовать sorted и написать свой собственный custom comparator. Пример -

>>> def my_compare(x, y): 
     return x - y 
>>> sorted([5, 2, 4, 1, 3], cmp=my_compare) 
[1, 2, 3, 4, 5] 

Так что в вашем случае, вы должны изменить функцию my_compare сделать упорядоченный вид. Я не собираюсь писать эту функцию для вас, но это поможет решить вашу проблему.

1

Регулярные выражения предназначены для обработки шаблонов в тексте, все, что они действительно делают, это поиск и извлечение подстрок из строки. То, что вы хотите, - это сделать интеллектуальную обработку. Это не выходит за рамки регулярного выражения, которое довольно легко накладывается на python :)

Вы говорите, что в вашем списке должно быть только «a», «b» или «c», чтобы вы могли написать простой функция сравнения

def cmp(c): 
    return {'a' : 1, 'b' : 0, 'c' : 2}[c] 

затем дать, что sorted

sorted(your_list, key=cmp) 

просто.