3

Is there any way in Python to reverse the formating operation done through the "%" operator ?

formated = "%d ooo%s" % (12, "ps")
#formated is now '12 ooops'
(arg1, arg2) = theFunctionImSeeking("12 ooops", "%d ooo%s")
#arg1 is 12 and arg2 is "ps"

EDIT Regexp can be a solution for that but they are harder to write and I suspect them to be slower since they can handle more complex structures. I would really like an equivalent to sscanf.

7
  • 5
    Yes: use regular expressions. Commented Jan 31, 2012 at 17:58
  • 1
    possible duplicate of sscanf in Python Commented Jan 31, 2012 at 17:59
  • @MichaelMrozek thanks, I did forgot the name of that C function Commented Jan 31, 2012 at 18:01
  • Is there a reason you don't want to use regular expressions? It would help if we could see what you want to do. Commented Jan 31, 2012 at 18:04
  • 1
    @JimDeLaHunt no, I didn't. I would have to have a sscanf equivalent to do so, don't I ? Commented Jan 31, 2012 at 18:44

1 Answer 1

6

Use regular expressions (re module):

>>> import re
>>> match = re.search('(\d+) ooo(\w+)', '12 ooops')
>>> match.group(1), match.group(2)
('12', 'ps')

Regular expressions is as near as you can get to do what you want. There is no way to do it using the same format string ('%d ooo%s').

EDIT: As @Daenyth suggested, you could implement your own function with this behaviour:

import re

def python_scanf(my_str, pattern):
    D = ('%d',      '(\d+?)')
    F = ('%f', '(\d+\.\d+?)')
    S = ('%s',       '(.+?)')
    re_pattern = pattern.replace(*D).replace(*F).replace(*S)
    match = re.match(re_pattern, my_str)
    if match:
        return match.groups()
    raise ValueError("String doesn't match pattern")

Usage:

>>> python_scanf("12 ooops", "%d ooo%s")
('12', 'p')
>>> python_scanf("12 ooops", "%d uuu%s")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in python_scanf
ValueError: String doesn't match pattern

Of course, python_scanf won't work with more complex patterns like %.4f or %r.

Sign up to request clarification or add additional context in comments.

5 Comments

@AsTeR there's no possible way to do it with the same format string.
Thanks Julio, can you please add it in your answer so I can accept it ?
Well technically you could write a function that takes a format string as an input and outputs a compiled regex that matches output from the format string...
@AsTeR I've added another option to my answer
Thanks for that elaborated answer

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.