If you know you are always parsing strings that have some form of a
"v<version>" and you are just worried about padding, then you can use a
very targeted regex to produce a numeric sort key:
import re
v = ["test_v1.ma", "test_v2.ma","test_v11.ma","test_v8.ma","test_v10.ma"]
sorted(v, key=lambda s: int(re.findall(r'_v(\d+)\.', s)[-1]))
# ['test_v1.ma', 'test_v2.ma', 'test_v8.ma', 'test_v10.ma', 'test_v11.ma']
This is just finding the "_v<number>" pattern, and converting that to an
int to use for sorting.
But if you wanted a more general solution, where you wanted to sort a
generic string, but doing numeric sorting where possible, you could do
something like this:
def string_to_key(s):
return [(int(i) if i.isdigit() else i) for i in re.split(r'(\d+)', s)]
sorted(v, key=string_to_key)
# ['test_v1.ma', 'test_v2.ma', 'test_v8.ma', 'test_v10.ma', 'test_v11.ma']
The string_to_key() function just takes a string like "
test_1_and_2_and_then_34_finally_v1.ma" and produces a list where the
numbers are actual ints:
string_to_key("test_1_and_2_and_then_34_finally_v1.ma")
# ['test_', 1, '_and_', 2, '_and_then_', 34, '_finally_v', 1, '.ma']
Then you use that as a key function in the call to sort and it will make
sure to do numeric comparisons. I actually use something like this in Qt
for sort filter proxy where I need the column to be sorted, taking into
account trailing numbers that aren't padded.
I think the point of using pyparsing is that regular expressions, while
powerful, can be complicated when they get to be large patterns and try to
take into account many rules. They are hard to debug because essentially
they are just big pattern strings. Pyparsing is defining a grammer. I
haven't used it, but I can see where it would be useful when you have many
rules that need to be considered.
On Wed, May 7, 2014 at 7:06 PM, Marcus Ottosson <[email protected]>wrote:
> Sorry, I completely missed the part of your questions containing the
> example. :)
>
> # 1. Get all string in a dict together with their version number
> pattern = re.compile(r'\d+')
> versions = {}for test in v:
> version = pattern.search(test).group()
> version = int(version)
> versions[version] = test
> # 2. Sort version numbers and fill up a new list of strings
> sorted_versions = []for version in sorted(versions):
> sorted_versions.append(versions[version])
> print sorted_versions
>
> ['test_v1.ma', 'test_v2.ma' ...]
>
>
>
> On 7 May 2014 07:51, Marcus Ottosson <[email protected]> wrote:
>
>> You could do something like this:
>>
>> >>> version = re.search(r'v\d+.nk', 'my_nukeFile_v12.nk').group()>>>
>> >>> version'v12.nk'
>>
>> At this point, you are guaranteed to always have a ‘v’ infront, and that
>> it will always end with ‘.nk’. At which point you could
>>
>> >>> version = int(version[1:-3])12
>>
>>
>>
>> On 7 May 2014 07:34, Stefan Andersson <[email protected]> wrote:
>>
>>> So here is a though. How would you guys go about to sort versioning that
>>> has no padding? For instance Nuke always adds v1,v2,v3 etc without padding.
>>> And some users are used to do that when versioning their files. I try and
>>> trap most of those things to add padding. But... there is always that case
>>> when you can't.
>>>
>>> v = ["test_v1.ma", "test_v2.ma","test_v11.ma","test_v8.ma","test_v10.ma
>>> "]
>>>
>>> how would you sort and print the last version? In a clever way. Right
>>> now there is a lot of splitting and sorting for me to get it right. But it
>>> feels there would be a "smart" way with regex, but I can't get my head
>>> around how to use that.
>>>
>>> regards
>>> stefan
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Wed, May 7, 2014 at 6:42 AM, Marcus Ottosson
>>> <[email protected]>wrote:
>>>
>>>> Just reading up on Pyparsing so I could be off here, but I would
>>>> actually argue that if a codebase relies heavily enough on strings (for
>>>> identification?) that regex no longer cuts it, I would consider whether or
>>>> not there is a better way of doing it, and not necessarily turn to heavier
>>>> guns in parsing.
>>>>
>>>> Again, I could very well be misunderstanding. Does anyone have an
>>>> example of Pyparsing in action?
>>>>
>>>>
>>>> On 7 May 2014 00:12, Jeremy YeoKhoo <[email protected]> wrote:
>>>>
>>>>> Thanks so much Chad, yes I agree. Not many TDs are aware or understand
>>>>> the necessity of good program design and structure (me included!) and in
>>>>> this case naming convention! Ill have to have a look at that and apply
>>>>> what
>>>>> I can to my own set of tools that i am currently in the process of
>>>>> creating
>>>>>
>>>>> Thanks
>>>>> -Jeremy
>>>>>
>>>>>
>>>>> On Sunday, 4 May 2014 20:47:26 UTC+10, Jeremy YeoKhoo wrote:
>>>>>
>>>>>> Hey guys,
>>>>>>
>>>>>> This should be fairly easy for you guys who know regex. If I have a
>>>>>> string that I want to enable versioning, so say for an example I want to
>>>>>> recognize a string if it contains ['v001', 'v002', etc...]
>>>>>> I have something like this...
>>>>>>
>>>>>> remp= re.search('[0-9]+', 'hello_v001')
>>>>>> print temp.group()
>>>>>>
>>>>>> but I dont want it to return when:
>>>>>> remp= re.search('[0-9]+', 'hello_001')
>>>>>> print temp.group()
>>>>>>
>>>>>> Thanks
>>>>>> -Jeremy
>>>>>>
>>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Python Programming for Autodesk Maya" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/python_inside_maya/ba398c57-19f8-4096-8524-07f609f1496c%40googlegroups.com<https://groups.google.com/d/msgid/python_inside_maya/ba398c57-19f8-4096-8524-07f609f1496c%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> *Marcus Ottosson*
>>>> [email protected]
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Python Programming for Autodesk Maya" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/python_inside_maya/CAFRtmOD-0rkPSh1QZrzntoLmk7Fawst3%3DGHWmT5w0Fo0yEgn5Q%40mail.gmail.com<https://groups.google.com/d/msgid/python_inside_maya/CAFRtmOD-0rkPSh1QZrzntoLmk7Fawst3%3DGHWmT5w0Fo0yEgn5Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>
>>>
>>> --
>>> Stefan Andersson | Digital Janitor
>>> social media -> "sanders3d"
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Python Programming for Autodesk Maya" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/python_inside_maya/CAKW24e29hZ%3DgrJndzhGxpw1j%2BEgVPc6Oi%2Bdcop5d_DMTwxtxCg%40mail.gmail.com<https://groups.google.com/d/msgid/python_inside_maya/CAKW24e29hZ%3DgrJndzhGxpw1j%2BEgVPc6Oi%2Bdcop5d_DMTwxtxCg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>>
>> --
>> *Marcus Ottosson*
>> [email protected]
>>
>
>
>
> --
> *Marcus Ottosson*
> [email protected]
>
> --
> You received this message because you are subscribed to the Google Groups
> "Python Programming for Autodesk Maya" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/python_inside_maya/CAFRtmOB1gRWVdmQW%3DpN83Th9tRfcgpquF135%2BnZw5uHf%3DFSN1g%40mail.gmail.com<https://groups.google.com/d/msgid/python_inside_maya/CAFRtmOB1gRWVdmQW%3DpN83Th9tRfcgpquF135%2BnZw5uHf%3DFSN1g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/CAPGFgA0Djfbzjy3Ky2YcApFyij-BaJKVJU0bqbvDGdnGRjHZ0w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.