0

“字符串方法”如图所示,例如:

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

“[教学大纲]美国社会学 131 AC 种族和民族(2012 年春季)docx”

太棒了,我正在编写的脚本涉及大量文本操作,这是我正在做的很多事情,并且随着我添加功能,它仍然很重要。

我正在做的常见操作之一是:

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)

[教学大纲] Sociology.131.AC.Race.and.Ethnicity.in.the.United.States(2012 年春季).​​docx

但我希望能够添加:“.ftype()”、“.fname()”、“.fterm()”和“.fext()”方法(对应于我拥有的这些函数)。我不知道该怎么做。

我希望在脚本中的一堆不同函数中使用它(所以它不会是类绑定或任何东西)。

我什至无法弄清楚我应该用谷歌搜索什么。但是我怎样才能添加这些方法呢?

PS 方法的名称并不重要——所以如果我必须更改这些名称以避免与内置方法或其他方法发生冲突,那也没关系。

编辑:我希望能够将此方法用于以下方面:

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

所以我不希望它被绑定到一个字符串或任何东西,我希望能够将它用于不同的字符串。

4

1 回答 1

4

您不能将方法添加到内置类型,例如str.

但是,您可以创建一个子类str并添加您想要的方法。作为奖励,添加@property这样您就不需要调用该方法来获取值。

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

通常,您将self用作方法参数列表中第一个参数的名称(接收对该方法附加到的实例的引用)。在这种情况下,我只是使用了f,因为您的表达式已经被编写为使用它。

于 2012-05-17T14:39:59.403 回答