0

The "String Method" as shown in, for example:

teststring = "[Syllabus]Sociology.131.AC.Race.and.Ethnicity.in.the.United.States (Spring 2012).docx"
print teststring.replace('.', ' ')

"[Syllabus]Sociology 131 AC Race and Ethnicity in the United States (Spring 2012) docx"

is fantastic and the script I'm writing involves A LOT of text manipulation, it's a lot of what I'm doing and as I add features it continues to be important.

One of the common manipulations I'm doing is:

teststring = "[Syllabus]Sociology.131.AC.Race.and.Ethnicity.in.the.United.States (Spring 2012).docx"
def f_type(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[1]
def f_name(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[2]
def f_term(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[3]
def f_ext(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[4]
print f_type(teststring)
print f_name(teststring)
print f_term(teststring)
print f_ext(teststring)

[Syllabus] Sociology.131.AC.Race.and.Ethnicity.in.the.United.States (Spring 2012) .docx

But I'd like to be able to add: ".ftype()", ".fname()", ".fterm()", and ".fext()" methods (corresponding to these functions I have). And I have no idea how to do that.

I'd be looking to use it in a bunch of different functions in the script (so it wouldn't be class-bound or anything).

I can't even figure out what I should be google-ing. But how can I add these methods?

P.S. The names of the methods aren't really important--so if I have to change these names to keep from conflicting with built-in methods or something that's okay.

EDIT: I'm looking to be able to use this method for things like:

def testfunction(f1, f2): print 'y' if f1.ftype()==f2.ftype() else 'n'

So I don't want it to be bound to one string or anything, I want to be able to use it for different strings.

1 Answer 1

4

You can't add methods to built-in types like str.

You can, however, create a subclass of str and add the methods you want. As a bonus, add @property so you don't need to call the method to get the value.

class MyString(str):
    @property
    def f_type(f):
        return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[1]

s = MyString(teststring)
s.f_type

Normally you'd use self as the name for the first parameter in a method's argument list (the one that receives the reference to the instance the method is attached to). In this case I just used f because your expression was already written to use it.

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

2 Comments

But this isn't going to let me use if a_ftype()==b_ftype(): do_something
Sure it will, assuming you mean a.f_type == b.f_type. a and b just need to be your str subclass rather than regular strings, and this is easily accomplished.

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.